Bashスクリプトを使用して、同じディレクトリにある複数のファイルの名前を変更したいと思います。ファイル名は次のとおりです。
file2602201409853.p
file0901201437404.p
file0901201438761.p
file1003201410069.p
file2602201410180.p
次の形式に名前を変更したいと思います。
file2503201409853.p
file2503201437404.p
file2503201438761.p
file2503201410069.p
file2503201410180.p
renameコマンドを読んでみましたが、何も実行されておらず、構文に問題があるようです。それからあなたが利用できることを読んだ。MVコマンドは次のとおりです。
for file in cmpsms*2014*.p; do
mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}"
done
ただし、このファイルの名前を変更することはできません。私は何が間違っていましたか?
答え1
まず、名前の変更を検討するのが正しいです。正規表現に慣れていない場合は、構文が少し変わりますが、一度実行していることがわかったら、最速かつ最短のパスになります。
rename 's/\d{4}/2503/' file*
これは最初の4つの数字と一致し、それをユーザーが指定した数字に置き換えます。
とテストハーネス(-vn
詳細な内容を意味しますが、そうではありません)する何でも)ファイル名を使用して:
$ rename 's/\d{4}/2503/' file* -vn
file0901201437404.p renamed as file2503201437404.p
file0901201438761.p renamed as file2503201438761.p
file1003201410069.p renamed as file2503201410069.p
file2602201409853.p renamed as file2503201409853.p
file2602201410180.p renamed as file2503201410180.p
答え2
これにより、トリックを実行できます。
for f in file*; do mv $f ${f/${f:4:8}/25032014}; done
4〜12番目の文字の間の文字列を「25032014」に置き換えます。
答え3
これは実際に上記の@Ericの答えです。しかし、エレガントな答えなので、より多くの注目を集めるために正解でポストバックしています。
for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done
答え4
繰り返しなしでこれを行う簡単な基本的な方法は次のとおりです。ディレクトリ巡回:
find -type f | xargs -I {} mv {} {}.txt
すべてのファイルの名前が変更されます。
以下は実際の例です並列化:
find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}2503${f:8}'