如何在没有大量转义的情况下使用find -exec

时间:2012-04-25 17:02:23

标签: bash

我经常使用find在一堆文件上运行相同的脚本。例如,如果我想在process.py中的所有.png文件上运行dir,我会这样做:

find dir -name '*.png' -execdir process.py \{\} \;
这个尖桩篱栅的东西到底是烦人的,不管怎么说?

3 个答案:

答案 0 :(得分:5)

使用:

find dir -name '*.png' -execdir process.py {} +

{}不需要转义;它们在相当有限的情况下对壳有特殊意义。 (特别是,echo {}回显大括号,而echo {a,b,c}回应a b c。)+也不需要转义。它告诉find'玩xargs'。也就是说,它将以每次执行合理的文件名运行命令。

请注意,使用-exec-execdir会自动全面地处理文件名中的空格(以及其他尴尬字符 - 换行符,退格键,换页符,任何人?)的问题。 -printxargs的管道名称在这里遇到问题。 GNU find加上GNU xargs-print0提供find选项,为-0提供xargs选项,以解决文件中奇数字符的问题名。

如果每个文件必须执行一次脚本,那么最后需要一个转义的分号;没有简单的方法(除非你数:SC=";"; find ... {} $SC,我不这样做。)

我看到的唯一问题是-execdir在子目录中运行脚本。当不同目录中存在不同文件时,您必须检查它是否表现良好,并且您需要确保{}转换为'使用时相对于其所在目录的文件名'使用-execdir(否则,通常不会通过给脚本的名称来定位文件)。所有这些都应该“正常工作”,因为如果他们不这样做,那么这些选项将无法有效地使用。

就个人而言,我宁愿只使用普通-exec,但可能有一个很好的理由让你选择-execdir

答案 1 :(得分:5)

根据您的键盘布局,"可能比'\使用起来更方便。 {} Stack Exchange站点知道,{}不需要转义。没有人能够识别出需要find dir -name "*.png" -execdir process.py {} ";" 转义的shell,并且手册页中的示例不会逃脱大括号。

{{1}}

Jonathan Leffler最后有一个带+的解决方案,它在语义上并不相同,但通常可用。

答案 2 :(得分:0)

你可以单引号'{}''''相反,但你必须以某种方式阻止shell本身解释这些字符。如果找到的数量很少,xargs也会起作用。