Bash
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/' {}/* \;
當我檢查是否
{}
擴展了用回顯替換重命名時:
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/* ...
如果我執行這些重命名命令中的任何一個,我就會重命名。所以應該是問題
{}
。謝謝你的幫助!
find | prename 's/\.jpg$/.jpeg/'
或者如果您在目前目錄中有 oder 文件
find 0[0-9][0-9] | prename 's/\.jpg$/.jpeg/'
在第一種情況下,
*
它在到達之前由 shell 擴展rename
(如果它完全擴展 - 我懷疑任何匹配{}/*
),如果它沒有擴展,則執行的命令rename
帶有三個參數-n
,s/jpg/jpeg/
和some/path/*
. 最後一個參數不是現有文件的名稱,因此rename
什麼也不做。沒有 shell globbing,路徑對
rename
.因此,改為:
find -maxdepth 3 -mindepth 3 -type f -iname '*.jpg' -exec rename -n 's/jpg$/jpeg/i' {} +
使用
find
’ 建構命令行的能力,只要可以使用+
而不是;
.