2017-08-01 33 views
-3

私は、開始日と.log(最後に)が同じになるが、ファイル名の間に異なる以下の形式で1つのディレクトリに複数のファイルがあります。Bashのファイルの名前の変更

file1vc001vpxd-1605_27_07_2017_1.log 
case2vc001vpxd-9169_27_07_2017_1.log 
server3vc001vpxd-4640_27_07_2017_1.log 
file24vc001vpxd-9170_27_07_2017_1.log 
files5vc001vp-4641_27_07_2017_1.log 

27_07_2017file1vc001vpxd-1605.log 
27_07_2017case2vc001vpxd-9169.log 
27_07_2017server3vc001vpxd-4640.log 
27_07_2017file24vc001vpxd-9170.log 
27_07_2017files5vc001vpxd-4641.log 

から私は違うといくつかのファイルを持っています。上記のファイル名は、file1、file2、file3、file4、case1、case2、number1、number2 ...のように扱ってください。単語 "ファイル"はすべてのファイル名形式で固定されていません - filename_date_1.logという名前に変更する必要があります。言い換えれば、それは私のLinuxサーバや組織では動作しませんrenameいるので、日付の後であるミドルネームをカットし、最初の日付と中央を保つので、

renamesedコマンドを使用することをお勧めしないでください必要があります私はsedを使用できません。

+1

ようこそスタックオーバーフロー。緊急に[About]と[Ask]ページをお読みください。 「緊急の援助」を求める質問はまったく勧められないことに注意してください。説明に緊急または同義語を含めるべきではありません。そして、あなたが助けを必要としないかどうか質問していないので、タイトルのヘルプを要求することは、同形的なことと同じです。 –

+3

末尾の '_1.log'はすべてのファイル名に対して固定ですか?何を試しましたか?どのコマンドを使用して検討していますか? MCVE([MCVE])は、なぜそれが働いていないのか、それが何を生産しているのか、何が生産されるべきなのかを説明しながら、最善の努力を示すべきです。 –

+1

なぜあなたの組織は 'sed'を使用できないのですか?あなたはAwk、Perl、Python、...を使うことができますか? Perlベースの 'prename'コマンドをインストールできないのはなぜですか?なぜ、最初に正しく生成されたファイル名を取得しないのですか? –

答えて

-1

ログを使用してディレクトリ内からログを実行します。

$(ls | sed 's/\([0-9]\{2\}_[0-9]\{2\}_[0-9]\{4\}\)\(.*\)\.log/mv & \2_\1_1.log/') 

すなわち

$> ls 
27_07_2017file1vc001vpxd-1605.log 
$> $(ls | sed 's/\([0-9]\{2\}_[0-9]\{2\}_[0-9]\{4\}\)\(.*\)\.log/mv & \2_\1_1.log/') 
$> ls 
file1vc001vpxd-1605_file1vc001vpxd-1605_1.log 

EDIT:

純粋bashの溶液、任意の外部ツールを使用しません。

for f in $(ls); do [[ $f =~ ([0-9]{2}_[0-9]{2}_[0-9]{4})(.*)\.log ]] && mv $f "${BASH_REMATCH[2]}_${BASH_REMATCH[1]}_1.log" ; done 

各ファイル名が指定された正規表現と一致しているかどうかを確認しています。一致する場合は、mvコマンドを実行します。

正規表現マッチを実行している間に、後で使用する必要があるので、一致する2つのグループをキャプチャします。

([0-9]{2}_[0-9]{2}_[0-9]{4})は、最初のグループにdd_dd_ddddという形式のものをすべてキャプチャします。 (.*)は何でもキャプチャできます。

正規表現([0-9]{2}_[0-9]{2}_[0-9]{4})(.*)\.logは、dd_dd_dddd<anything here>.logという形式のファイル名と一致します。

+0

ありがとう、 mvコマンドでPLZを使用することができますか? 私の組織はsed cmdを使用することはできません。 私は私の質問を編集しました、plzは見ています。 最初と最後の中間から日付を切り捨てることは可能ですか?_ など。 27_07_2017file1vc001vpxd-1605.log 27_07_17case2vc001vpxd-9169.log それが使用して file1vc001vpxd-1605_27_07_2017_1.log case2vc001vpxd-9169_27_07_17_1.log "MV" CMD可能でなければなりません? – Nirmal

+0

@Nirmal私は答えを更新しました。これは特定の形式でのみ有効です。あなたの例で示したように、 ".log"だけでなく "_1.log"を追加しました。 – Anubis

+0

あなたのコードを説明することは可能ですか? は、最初にドットを配置するように見えます。単語を抽出し、私の順序で単語を配置する.. ??右 日付形式が27_07_17の場合はどうなりますか? for $(ls); "$ {BASH_REMATCH [1]} _ 1.log"; $ {BASH_REMATCH [2]} $; done – Nirmal

関連する問題