我正在嘗試使用包含空格的父檔案夾遞回重命名一些檔案,我在 ubuntu 終端中嘗試了以下命令:
find . -type f -name '* *' -print0 | xargs -0 rename 's/ //'
它給出了以下關于檔案夾名稱的錯誤:
Can't rename ./FOLDER WITH SPACES/FOLDER1.1/SUBFOLDER1.1/FILE.01 A.jpg
./FOLDERWITH SPACES/FOLDER1.1/SUBFOLDER1.1/FILE.01 A.jpg: No such file
or directory
如果我沒有弄錯,檔案夾中有空格的事實不應該影響行程,因為它使用了標志-f。
uj5u.com熱心網友回復:
傳遞給的xargs是檔案的完整路徑,而不僅僅是檔案名。所以你的s/ //替代命令也會從目錄部分洗掉空格。由于新目錄(沒有空格)不存在,您會看到您看到的錯誤。在您的示例中,重命名是:
./FOLDER WITH SPACES/FOLDER1.1/SUBFOLDER1.1/FILE.01 A.jpg ->
./FOLDERWITH SPACES/FOLDER1.1/SUBFOLDER1.1/FILE.01 A.jpg
如果目錄./FOLDERWITH SPACES/FOLDER1.1/SUBFOLDER1.1不存在,這是不可能的。
嘗試以下-d選項rename:
find . -type f -name '* *' -print0 | xargs -0 rename -d 's/ //'
(該-d選項僅重命名路徑的檔案名部分。)
請注意,您不需要xargs. 您可以使用以下-execdir操作find:
find . -type f -name '* *' -execdir rename 's/ //' {}
由于-execdir命令是在包含匹配檔案的子目錄中執行的,因此您不再需要-d選項rename。也不需要的-print0動作find。
最后注意:如果要替換檔案名中的所有空格,而不僅僅是第一個,請不要忘記添加g標志:rename 's/ //g'。
uj5u.com熱心網友回復:
您是正確的,因為-type f -name '* *'只能找到名稱中帶有空格的檔案,但會find列印包括父目錄在內的整個路徑,因此如果您有
dir with blank/file with blank.txt
你rename 's/ //'在那個字串上做,你得到
dirwith blank/file with blank.txt
因為整個字串中的第一個空格被洗掉了。現在路徑已更改,使先前找到的結果無效。
你可以
使用不同的咒語
renamea) 僅適用于最后一個之后的部分/和 b) 替換多個空格:find . -type f -name '* *' -print0 | xargs -0 rename -n 's| (?=[^/]*$)||g's/ (?=[^\/]*$)//g匹配所有后跟字符的空白,/直到字串末尾,其中(?=...)是前瞻。1您可以使用rename -n試運行,直到一切正常。(使用 GNU
find)用于-execdir相對于找到檔案的目錄進行操作,并且還使用 Bash 引數擴展而不是rename:find \ -type f \ -name '* *' \ -execdir bash -c 'for f; do mv "$f" "${f//[[:blank:]]}"; done' _ {}這會收集盡可能多的匹配項,然后使用所有匹配項呼叫 Bash 命令;
for f迭代所有位置引數(即每個檔案),并且該mv命令洗掉所有空格。_是$0內在的替身bash -c,并沒有真正做任何事情。${f//[[:blank:]]}是一個引數擴展,它[[:blank:]]從字串中洗掉所有的實體$f。您可以使用
echo mv直到一切正常。
1有一種更簡單的方法可以使用 來實作相同的目的rename -d,請參閱Renaud 的回答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/339560.html
