2014-11-05 55 views
3

任何人都可以推薦一個安全的解決方案,以遞歸方式從給定的根目錄開始,用文件和目錄名稱中的下劃線替換空格嗎?例如,Bash遞歸地替換名稱上的很多空格

 
$ tree 
. 
|-- a dir 
| `-- file with spaces.txt 
`-- b dir 
    |-- another file with spaces.txt 
    `-- yet another file with spaces.pdf 

變爲:

 
$ tree 
. 
|-- a_dir 
| `-- file_with_spaces.txt 
`-- b_dir 
    |-- another_file_with_spaces.txt 
    `-- yet_another_file_with_spaces.pdf 

我已經複製由是最主要的問題其他用戶的問題,但我需要添加另外一個問題:

我使用解決方案如下:

$ find -depth -name '* *' -execdir rename " " "_" {} +; 

它的工作原理,但只取代在項目(目錄或文件)上找到的第一個空格。任何關於如何使循環尋找空間並在全部消失時停止的想法?

+0

下面的解決方案適用於我。我剛剛添加了-depth選項。沒有它,父目錄的名稱已更改並且進程崩潰。 謝謝! – 2014-11-05 20:40:36

回答

2

您可以使用:

find . -depth -name '* *' -execdir rename 's/ /_/g' {} + 
+1

確實,來自問題的錯誤複製/粘貼錯誤。謝謝! – anubhava 2014-11-05 20:28:55

+1

這似乎假定「重命名」的版本不同於OP所使用的版本(Perl腳本)(它似乎是來自'util-linux-ng'包的版本。 – chepner 2014-11-05 20:33:57

3

如果沒有可用的rename做,或者如果你不知道你的版本,這裏有一個方法來實現這一目標:

find . -depth -name '* *' -execdir bash -c 'for i; do mv "$i" "${i// /_}"; done' _ {} + 
0

這裏沒有rename

find -type d -name "* *" -print | awk '{print;gsub(" ","_",$0);print}' | xargs -r -n2 -d "\n" mv 
find   -name "* *" -print | awk '{print;gsub(" ","_",$0);print}' | xargs -r -n2 -d "\n" mv 

我認爲解決方案有沒有\n在你的文件名中。