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