Bash

Bash 使用 find -exec 重命名 360 000 個文件

  • December 8, 2016

我有大約 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’ 建構命令行的能力,只要可以使用+而不是;.

引用自:https://unix.stackexchange.com/questions/177705