我经常使用find
在一堆文件上运行相同的脚本。例如,如果我想在process.py
中的所有.png
文件上运行dir
,我会这样做:
find dir -name '*.png' -execdir process.py \{\} \;
这个尖桩篱栅的东西到底是烦人的,不管怎么说?
答案 0 :(得分:5)
使用:
find dir -name '*.png' -execdir process.py {} +
{}
不需要转义;它们在相当有限的情况下对壳有特殊意义。 (特别是,echo {}
回显大括号,而echo {a,b,c}
回应a b c
。)+
也不需要转义。它告诉find
'玩xargs
'。也就是说,它将以每次执行合理的文件名运行命令。
请注意,使用-exec
或-execdir
会自动全面地处理文件名中的空格(以及其他尴尬字符 - 换行符,退格键,换页符,任何人?)的问题。 -print
到xargs
的管道名称在这里遇到问题。 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也会起作用。