如何删除shell脚本中所有子目录中的空间?

kri*_*hna 8 directory find shell-script rename mv

我尝试按照 shell 脚本删除所有带下划线的空格:

find $1 -depth -name "* *" -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
Run Code Online (Sandbox Code Playgroud)

如果我有一个目录,/home/user/g h/y h/u j/它会将y h目录修改为y_h,然后它会给出以下错误/home/user/g h/y h/u j

No such file or directory
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 6

用这个:

find -name "* *" -print0 | sort -rz | \
  while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
Run Code Online (Sandbox Code Playgroud)

find将搜索名称中带有空格的文件和文件夹。这将-print0使用空字节作为分隔符打印 ( ) 以处理特殊文件名。

sort -rz反转文件顺序,使文件夹中的文件最深的是移动第一个和文件夹本身将是最后一个。因此,在所有文件和文件夹在其中重命名之前,永远不会重命名文件夹。

最后,该mv命令重命名文件/文件夹。在目标名称中,我们只删除文件 basename 的空格,否则它将无法再访问。