0

我的 bash 脚本有问题...我想以递归方式重命名所有文件、文件夹和子文件夹,从小写字母变为大写字母(反之亦然)。我写了这个脚本,但它不起作用。

find . -depth -iname \* -exec mv {} `echo {} | tr [:upper:] [:lower:]` \;

有什么建议么?谢谢

4

2 回答 2

1

问题是你在反引号中的命令echo {} | tr [:upper:] [:lower:]首先被shell扩展,所以find实际看到的参数是

find . -depth -iname \* -exec mv {} {} \;

tr [:upper:] [:lower:]在输入上运行{}只会让你{}再次回来)。

这是一种解决方法,使用 subshel​​l 作为-exec命令:

find . -mindepth 1 -depth -iname \* -exec \
    sh -c 'mv "$0" "`tr \[:upper:\] \[:lower:\] <<<"$0"`"' {}  \;

或者更易读,使用 $() 语法:

find . -mindepth 1 -depth -iname \* -exec \
    sh -c 'mv "$0" "$(tr "[:upper:]" "[:lower:]" <<<$0)"' {}  \;

请注意,您还需要引用tr字符范围以阻止 shell 扩展它们!

添加 也是一个好主意,-mindepth 1这样您在尝试运行时就不会出错mv . .

于 2011-11-16T09:42:03.570 回答
1

为什么不使用简单的 while 循环:

find testdir/ -depth | while read file; do NEWNAME=$(dirname "$file")/$(echo $(basename "$file") | tr '[:lower:]' '[:upper:]'); mv "$file" "$NEWNAME"; done
于 2011-11-16T09:46:08.420 回答