拡張子がわずかに異なる複数のファイルの名前を変更するには?

拡張子がわずかに異なる複数のファイルの名前を変更するには?

複数のファイルがあり、すべて同様の命名パターンを持っています。たとえば、次のようになります。

{filename}.jpeg{random number}

.jpeg拡張子を持つようにこのファイルの名前を変更したいと思います。どうすればいいですか?

答え1

Larry WallのPerlの名前変更がある場合

rename 's/[.]jpeg[0-9]*/.jpeg/' *.jpeg[0-9]*

Util-Linuxのみがある場合、名前の変更は機能しません。

Bashでforループを使用できます

for n in *.jpeg[0-9]*
do mv -i "$n" "${n%%.jpeg[0-9]*}.jpeg"
done

${var%%pattern}標準パラメータ拡張値に展開し、一致のvar(最も長い)末尾の部分を削除しますpattern。もしそうならn、そうですfoo.jpeg123。(原因かもしれません)${n%%.jpeg[0-9*}foofoo.jpeg1abcfoo

答え2

実行する前に'を使用することをお勧めします。zshこれzmvにより、潜在的な競合を防ぐことができます(たとえば、afile.jpeg1とファイルの両方が現在のディレクトリに存在します)。file.jpeg2どの名前を変更してください。

存在するzsh

autoload zmv # best in ~/.zshrc
zmv -n '(*.jpeg)<->' '$1'

ここで<-><x-y>ここで一致する数値の範囲に制限はありません)は、同様に任意の10進数シーケンスと一致します[0-9]##

(満足のいく場合は-nテスト実行のために削除してください)。

答え3

各名前には1つの部分文字列しかありませんが、.jpeg標準のシェルループを使用してその部分文字列の後にあるすべての項目(数字でも他の文字列でも)を削除したいとします。

for name in *.jpeg*; do
    mv -i -- "$name" "${name%.jpeg*}.jpeg"
done

パラメーター置換は、値から${name%.jpeg*}それに続くすべての項目を削除します。次に、置換結果に対応する文字列を追加して新しいファイル名を作成します。.jpeg$name.jpeg

mv -i --このビットは、既存の名前を上書きする前に確認を要求する方法で呼び出されます。これは、名前がダッシュ(コマンドラインオプションの終わりを示す)で始まる場合、次のファイル名が誤ってオプションセットとして認識されるのを防ぐためですmv----

関連情報