我在许多文件夹中有大量文件。有些文件会引起问题,所以我需要将括号重命名为其他名称,其他任何名称都可以。
我尝试使用这些命令来查找所有带有“(”或“)”的文件。
显然这是行不通的:
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) 参数。