如何遍历所有子文件夹并将所有名为“旧”的文件夹重命名为“新”
答案1
如果你有zsh
:
autoload zmv
zmv -QW '**/Old(/)' '**/New'
zmv -W ‘**/旧’ ‘**/新’
这里autoload zmv
加载zmv
zsh 自带的脚本;zmv -W pattern replacement
表示“对于每个匹配,记住 中的所有通配符的值,并用该值替换pattern
中的相应通配符”;表示“允许模式中的 glob 限定符”;表示“匹配当前目录下树中名为“Old”的所有文件”,并且glob 限定符将“所有文件”限制为仅限目录。其他有用的选项:replacement
zmv -Q
'**/Old'
(/)
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 之外不需要任何东西。
答案2
像这样:
find . -type d -exec rename <rename options> \;
重命名选项将根据rename
您所拥有的选项而有所不同。Red Hat 重命名使用rename Old New {}
,而 Debian/Ubuntu 系统通常使用“Perl 重命名”,它将使用以下语法:
rename 's/^Old$/New/' {}
这只会改变“旧”的完全匹配;s/Old/New/g
如果您想将所有出现的“旧”更改为“新”,包括一个文件夹名称内的多次出现,请使用。