2014-11-05 48 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在你的文件名中。