Linux/Ubuntu - 如何查找所有带括号的文件?

Linux/Ubuntu - 如何查找所有带括号的文件?

我在许多文件夹中有大量文件。有些文件会引起问题,所以我需要将括号重命名为其他名称,其他任何名称都可以。

我尝试使用这些命令来查找所有带有“(”或“)”的文件。

显然这是行不通的:

find . -name *(*

我需要转义“(”字符:

find . -name *\(*

或者

find . -name '*\(*'

或者

find . -name "*\(*"

以上两种方法都不起作用。

最后,我希望以下操作能够发挥作用:

`find . -name '*.*' -prune -o -exec rename 's/\*/(*$/\OOOO/i' {} +`  

以上操作应将任何“(”字符重命名为 0000(例如,Document(July).xls 将更改为 Document0000July).xls)

然后

find . -name '*.*' -prune -o -exec rename 's/\*/)*$/\1111/i' {} +

这会将任何“)”字符重命名为 1111(例如,Document0000July).xls 将更改为 Document0000July1111.xls)

有任何想法吗?

谢谢

答案1

一个简单且非常便携的解决方案(但可能会因特殊文件名的情况而受阻……如果您有一个更强大的解决方案,可以最近的GNU xargs 版本并查找):

find . \( -name '*(*' -o -name '*)*' \) -print > ze_list
while read a_line ; do 
   echo mv "$a_line" "$(echo "$a_line" | sed -e 's/(/0000/g' -e 's/)/1111/g')" ; 
done < ze_list

然后,如果你确信它会做你想做的事,就去掉“回声”

(不要担心,因为使用 echo 时 shell 会隐藏周围的引号(“,但它们会在那里确保“mv”只接收 2 个参数,一个源和一个目标。)

“$(....|....)” 是替换出现的位置。周围的引号很重要,这样即使结果名称包含空格,它仍将被视为一个 (1) 参数。

相关内容