複数のファイルがあり、すべて同様の命名パターンを持っています。たとえば、次のようになります。
{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*}
foo
foo.jpeg1abc
foo
答え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
。--
--