小写一个目录下的所有目录

erk*_*gur 12 command-line directory rename

我想小写一个目录下的每个目录的名称。我可以用哪些命令来做到这一点?

Gil*_*il' 10

一级的所有目录,还是递归的?

Zsh

一方面:

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脚本来应对.*留给读者练习)。

Perl 重命名

在这里,我使用 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)