Answers:
如果你有zsh:
autoload zmv
zmv -QW '**/Old(/)' '**/New'
zmv -W'** / Old''** / New'
这里autoload zmv加载zmvzsh附带的脚本; zmv -W pattern replacement表示«为每个匹配记住所有通配符的值pattern并replacement用此值替换相应的通配符»; zmv -Q意味着«允许模式中的全局限定符»; '**/Old'表示«匹配当前目录下树中名为«Old»的所有文件»并且(/)glob限定符将«所有文件»限制为仅目录。其他有用的zmv选择:
-n:什么都不做,只打印将要做的事情。-i:显示要执行的每一行并询问是否执行它-f:强制覆盖目标文件如果你更喜欢[ba] sh:
RnAll() { for f in "$1"/* ; do [ -d "$f" ] || continue ; ( RnAll "$f" "$2" "$3" ) ; [ "`basename $f`" \== "$2" ] && mv "$f" "`dirname $f`/$3" ; done }
RnAll . Old New
这几乎是纯粹的sh(或至少是bash)解决方案,除了shell和coreutils之外不需要任何东西。
像这样的东西:
find . -type d -exec rename <rename options> \;
重命名选项将根据rename您的具体情况而有所不同。Red Hat重命名使用rename Old New {},而Debian / Ubuntu系统经常使用“Perl rename”,它将使用以下语法:
rename 's/^Old$/New/' {}
这只会改变“旧”的完全匹配; 使用s/Old/New/g,如果你想改变“老”到“新”的所有occurrances,其中一个文件夹名称中的多个occurrances。
rename 's/^Old$/New/' {}...只会改变“Old”的完全匹配; 使用s/Old/New/g,如果你想改变“老”到“新”的所有occurrances,其中一个文件夹名称中的多个occurrances。