Bashはfind -execを使用して360,000のファイル名を変更します。

Bashはfind -execを使用して360,000のファイル名を変更します。

約360,000個のファイルがあります。たとえば、次のようになります。

./001/1/1.jpg
./001/1/2.jpg
./001/2/1.jpg
./002/1/1.jpg
./003/1/1.jpg
...
pattern: [60 dirs]/[1000 subdirs]/[4-10 files].jpg

renameたとえば、ファイル名を* .jpgから* .jpegに変更したいとします。rename引数リストが長すぎるというエラーが発生するため、Singleを使用してこれを実行することはできません。

解決策を探している間にこれを見つけましたが、名前は変わりませんでした。

find -maxdepth 2 -mindepth 2 -type d -exec rename -n 's/jpg/jpeg/' {}/* \;

拡張されたことを確認するときは、{}名前の変更をechoに変更してください。

find -maxdepth 2 -mindepth 2 -type d -exec echo "rename -n 's/jpg/jpeg/' {}/*" \;

期待される結果を得る。

rename -n 's/jpg/jpeg/' ./061/61430/*
rename -n 's/jpg/jpeg/' ./061/61431/*
...

これらの名前変更コマンドを実行すると、ジョブ名が変更されます。だからそれが質問になるはずです{}

助けてくれてありがとう!

答え1

最初の場合、コマンドは、および3つの引数を使用して実行され*ます。最後の引数は既存のファイルの名前ではないので、何もしません。rename{}/*rename-ns/jpg/jpeg/some/path/*rename

シェルワイルドカードがない場合、パスはrename

したがって、次のようにします。

find -maxdepth 3 -mindepth 3 -type f -iname '*.jpg' -exec rename -n 's/jpg$/jpeg/i' {} +

find+可能であれば、代わりにコマンドラインを作成する機能を使用してください;

答え2

find  | prename 's/\.jpg$/.jpeg/'

または、現在のディレクトリに注文ファイルがある場合

find 0[0-9][0-9] | prename 's/\.jpg$/.jpeg/'

答え3

type dディレクトリ名を変更したくない限り、それを指定しないでください。拡張子を変更するには、以下を.jpg試してください。.jpeg

find . -maxdepth 2 -mindepth 2 -name '*.jpg' -exec sh -c 'echo mv -- "$0" "${0%%.jpg}.jpeg"' {} \;

echo画面に表示される内容が気に入ったら削除してください。

答え4

cygwinを使用すると、名前が変更されたバージョンに正規表現の置換はなく、その構文rename [options] expression replacement file...も機能しないようです。また、bash提案は失敗します。

... -c: line 0: unexpected EOF while looking for matching `"'
... -c: line 1: syntax error: unexpected end of file

ああ…いつもPerlがあります。

perl -MFile::Find -e 'find(sub{return unless /^(.*)\.jpg$/;`mv $_ $1.jpeg`}, ".")'

関連情報