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。我無法使用 single 來做到這一點rename,因為我收到錯誤參數清單太長。

在尋找解決方案時,我發現了這一點,但它沒有重命名任何內容:

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

在第一個實例中,在*到達之前由 shell 展開rename(如果它完全展開 - 我懷疑是否有任何匹配{}/*),如果它沒有展開,則執行的命令帶有rename三個參數-n,s/jpg/jpeg/some/path/*。最後一個參數不是現有文件的名稱,因此rename不執行任何操作。

如果沒有 shell 通配符,則該路徑對於rename.

因此,請執行以下操作:

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

find盡可能使用來建立命令列的能力+,而不是;

答案2

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

或如果目前目錄中有 order 文件

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`}, ".")'

相關內容