在bash中重命名文件夹,文件和子文件夹

时间:2011-11-16 09:10:14

标签: file bash directory renaming

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

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

有什么建议吗? 感谢

2 个答案:

答案 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