Bashrecursion地replace名字上的许多空格

任何人都可以推荐一个安全的解决scheme,从给定的根目录开始recursion地replace文件和目录名下划线的空格? 例如,

 $树
 。
 |  - 一个dir
 |  ` - 文件与spaces.txt
 ` -  b dir
     |  - 带有spaces.txt的另一个文件
     ` - 另一个文件与spaces.pdf

变为:

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

我已经复制了另一个用户的问题,这是主要问题,但我需要添加另一个问题:

我正在使用下面的解决scheme:

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

它的工作原理,但只取代在一个项目(目录或文件)上find的第一个空格。 任何想法如何使循环寻找空间,并停止时,他们都走了?

如果您没有rename ,或者您不确定您拥有哪个版本,则可以通过以下方法来实现:

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

您可以使用:

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

这是没有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