递归重命名文件

递归重命名文件

我对 Linux 还很陌生,所以需要一些帮助。

是否有办法使其适用于所有子目录内容而不仅仅是当前目录?

for f in *\ *; do mv "$f" "${f// /_}"; done

答案1

zsh

autoload zmv # best in ~/.zshrc
zmv '(**/)(* *)' '$1${2// /_}'

就像您的代码一样,它不会重命名隐藏文件。它也不查看隐藏目录内部。如果您想重命名它们,请将其更改为:

autoload zmv # best in ~/.zshrc
zmv '(**/)(* *)(#qD)' '$1${2// /_}'

后一个的等效bash项(但没有 提供的保护措施zmv,因此您可能需要向 添加一个-i选项mv)是:

LC_ALL=C find . -depth -name '* *' -exec bash -c '
  for file do
    base=${file##*/}
    mv -i -- "$file" "${file%/*}${base// /_}"
  done' bash {} +

没有第一个的简单等效项,因为它无法组合-prune(不需要下降到隐藏目录)和-depth.然而,功能上等效的可以写为:

LC_ALL=C find . -depth -name '* *' ! -path '*/.*' -exec bash -c '
  for file do
    base=${file##*/}
    mv -i -- "$file" "${file%/*}${base// /_}"
  done' bash {} +

它会下降到隐藏目录,但不会重命名那里的文件。

相关内容