在bash中重命名文件夹,文件和子文件夹
问题描述:
我有一个bash脚本的问题... 我想以递归的方式将所有文件,文件夹和子文件夹从 小写改为大写(或反之亦然)。 我写过这个脚本,但它不起作用。在bash中重命名文件夹,文件和子文件夹
find . -depth -iname \* -exec mv {} `echo {} | tr [:upper:] [:lower:]` \;
有什么建议吗? 感谢
答
为什么不使用一个简单的while循环:
find testdir/ -depth | while read file; do NEWNAME=$(dirname "$file")/$(echo $(basename "$file") | tr '[:lower:]' '[:upper:]'); mv "$file" "$NEWNAME"; done
答
的问题是,在反引号,echo {} | tr [:upper:] [:lower:]
你的命令,获取由外壳第一延展,所以什么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"`"' {} \;
或者其可读性,使用$()语法:
请注意,您还需要引用tr
字符范围来阻止shell扩展它们!
添加-mindepth 1
也是一个好主意,因此您不会因尝试运行mv . .
而出现错误。
我试过使用你的第一个脚本,但它只是改变文件夹树的第一个“级别”。如果我有,例如,DocumentsFolder-JobFolder-Test.txt,执行后我有DOCUMENTFOLDER-JobFolder-Test.txt。我想要大写的所有文件夹,子文件夹和文件,如DOCUMENTFOLDER-JOBFOLDER-TEST.TXT。 – Ant4res
对不起,我更正了代码。它应该如预期那样工作。 – johnbaum
谢谢!有用! – Ant4res