Gil*_*il' 10
一级的所有目录,还是递归的?
一方面:
autoload zmv
zmv -o-i -Q 'root/(*)(/)' 'root/${1:l}'
Run Code Online (Sandbox Code Playgroud)
递归地:
zmv -o-i -Q 'root/(**/)(*)(/)' 'root/$1${2:l}'
Run Code Online (Sandbox Code Playgroud)
说明:zmv
根据给定的替换文本重命名匹配模式的文件。-o-i
将-i
选项传递给mv
引擎盖下的每个命令(见下文)。在替换文本中$1
,$2
、 等是模式中连续的括号组。**
递归地表示所有(子)*目录。最后(/)
一个不是带括号的组,而是一个全局限定符,意思是只匹配目录。${2:l}
转换$2
为小写。
一方面:
for x in root/*/; do mv -i "$x" "$(printf %s "$x" | tr '[:upper:]' '[:lower:]')"; done
Run Code Online (Sandbox Code Playgroud)
最后/
将匹配限制为目录,并mv -i
在发生冲突时要求确认。删除-i
以在发生冲突时覆盖,并使用yes n | for …
。不会被提示,也不会执行任何会冲突的重命名。
递归地:
find root/* -depth -type d -exec sh -c '
t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
[ "$t" = "$0" ] || mv -i "$0" "$t"
' {} \;
Run Code Online (Sandbox Code Playgroud)
的使用-depth
确保在它们的祖先之前处理深层嵌套的目录。名称处理依赖于有一个/
; 如果你想在当前目录下调用操作,使用./*
(调整shell脚本来应对.
或*
留给读者练习)。
在这里,我使用 Debian 和 Ubuntu/usr/bin/prename
提供的 Perl 重命名脚本(通常也可用rename
)。一方面:
rename 's!/([^/]*/?)$!\L/$1!' root/*/
Run Code Online (Sandbox Code Playgroud)
递归地,使用 bash ?4 或 zsh:
shopt -s globstar # only in bash
rename 's!/([^/]*/?)$!\L/$1!' root/**/*/
Run Code Online (Sandbox Code Playgroud)
递归地,可移植地:
find root -depth -type d -exec rename -n 's!/([^/]*/?)$!\L/$1!' {} +
Run Code Online (Sandbox Code Playgroud)