Bash スクリプトを使用して複数のファイルの名前を変更する

Bash スクリプトを使用して複数のファイルの名前を変更する

Bash スクリプトを使用して、同じディレクトリ内の複数のファイルの名前を変更したいと思います。ファイル名は次のとおりです。

file2602201409853.p
file0901201437404.p  
file0901201438761.p  
file1003201410069.p  
file2602201410180.p

名前を次の形式に変更します。

file2503201409853.p
file2503201437404.p  
file2503201438761.p  
file2503201410069.p  
file2503201410180.p

私は名前変更コマンドについて読んでいて、この方法で実行しようとしましたが、何も起こりませんでした。構文に疑問があると思います。次に、動画次のようにコマンドを実行します。

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}'

関連情報