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

在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 
+0

我试过使用你的第一个脚本,但它只是改变文件夹树的第一个“级别”。如果我有,例如,DocumentsFolder-JobFolder-Test.txt,执行后我有DOCUMENTFOLDER-JobFolder-Test.txt。我想要大写的所有文件夹,子文件夹和文件,如DOCUMENTFOLDER-JOBFOLDER-TEST.TXT。 – Ant4res

+0

对不起,我更正了代码。它应该如预期那样工作。 – johnbaum

+0

谢谢!有用! – Ant4res

的问题是,在反引号,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 . .而出现错误。

+0

感谢您的解释......我试图运行的脚本,但我得到了很多语法错误和文件夹的子文件夹和文件名 – Ant4res

+0

内没有变化看起来你已经通过其他方式得到了答案,但是对于记录而言,原始代码无法正确使用带空格的文件名,这可能是问题所在。我现在纠正了它。一旦你达到这么多的报价水平,循环解决方案开始看起来相当不错, - ;) –

+0

感谢您的回答!但是, Ant4res