我对 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 {} +
它会下降到隐藏目录,但不会重命名那里的文件。