2

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

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

最后的尖桩篱笆很烦人,有什么办法解决吗?

4

3 回答 3

5

采用:

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

{}不需要逃避;它们仅在相当有限的情况下对 shell 具有特殊意义。(特别是,echo {}回显大括号,而回显echo {a,b,c}a b c+也不需要转义。它告诉find我们要“玩现xargs”。也就是说,它将在每次执行时使用尽可能多的文件名运行命令。

请注意,使用-execor-execdir自动和全面地处理文件名中的空格(和其他尴尬的字符 - 换行符、退格符、换页符,任何人?)的问题。-print用into管道名称xargs在这里遇到问题。GNU findplus GNUxargs提供了解决文件名中奇数字符问题的-print0选项find-0选项。xargs

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

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

就个人而言,我宁愿只使用 plain -exec,但你选择 可能是有充分理由的-execdir

于 2012-04-25T17:04:37.410 回答
5

根据您的键盘布局,"使用起来可能比'或更方便\就Unix & Linux Stack Exchange 站点所知,{}不需要转义。没有人能识别出需要转义的 shell,并且手册页中的示例没有转义大括号。{}

find dir -name "*.png" -execdir process.py {} ";"

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

于 2012-04-25T17:13:04.413 回答
0

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

于 2012-04-25T17:07:03.057 回答