我的 bash 脚本有问题...我想以递归方式重命名所有文件、文件夹和子文件夹,从小写字母变为大写字母(反之亦然)。我写了这个脚本,但它不起作用。
find . -depth -iname \* -exec mv {} `echo {} | tr [:upper:] [:lower:]` \;
有什么建议么?谢谢
问题是你在反引号中的命令echo {} | tr [:upper:] [:lower:]
首先被shell扩展,所以find
实际看到的参数是
find . -depth -iname \* -exec mv {} {} \;
(tr [:upper:] [:lower:]
在输入上运行{}
只会让你{}
再次回来)。
这是一种解决方法,使用 subshell 作为-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 . .
。
为什么不使用简单的 while 循环:
find testdir/ -depth | while read file; do NEWNAME=$(dirname "$file")/$(echo $(basename "$file") | tr '[:lower:]' '[:upper:]'); mv "$file" "$NEWNAME"; done