我经常find
在一堆文件上运行相同的脚本。因此,例如,如果我想process.py
在 中的所有.png
文件上运行dir
,我会这样做:
find dir -name '*.png' -execdir process.py \{\} \;
最后的尖桩篱笆很烦人,有什么办法解决吗?
我经常find
在一堆文件上运行相同的脚本。因此,例如,如果我想process.py
在 中的所有.png
文件上运行dir
,我会这样做:
find dir -name '*.png' -execdir process.py \{\} \;
最后的尖桩篱笆很烦人,有什么办法解决吗?
采用:
find dir -name '*.png' -execdir process.py {} +
{}
不需要逃避;它们仅在相当有限的情况下对 shell 具有特殊意义。(特别是,echo {}
回显大括号,而回显echo {a,b,c}
。a b c
)+
也不需要转义。它告诉find
我们要“玩现xargs
”。也就是说,它将在每次执行时使用尽可能多的文件名运行命令。
请注意,使用-exec
or-execdir
自动和全面地处理文件名中的空格(和其他尴尬的字符 - 换行符、退格符、换页符,任何人?)的问题。-print
用into管道名称xargs
在这里遇到问题。GNU find
plus GNUxargs
提供了解决文件名中奇数字符问题的-print0
选项find
和-0
选项。xargs
如果您必须对每个文件执行一次脚本,那么最后需要一个转义的分号;没有简单的方法解决这个问题(除非你数:SC=";"; find ... {} $SC
,我没有)。
我看到的唯一问题是-execdir
在子目录中运行脚本。当不同的目录中有不同的文件时,您必须检查它的行为是否正常,并且您需要确保在使用时{}
转换为“相对于它所在目录的文件名” -execdir
(否则,通常,该文件无法通过赋予脚本的名称来定位)。所有这些都应该“正常工作”,因为如果不这样做,这些选项将无法有意义地使用。
就个人而言,我宁愿只使用 plain -exec
,但你选择 可能是有充分理由的-execdir
。
根据您的键盘布局,"
使用起来可能比'
或更方便\
。就Unix & Linux Stack Exchange 站点所知,{}
不需要转义。没有人能识别出需要转义的 shell,并且手册页中的示例没有转义大括号。{}
find dir -name "*.png" -execdir process.py {} ";"
Jonathan Leffler 有一个最后加上 + 的解决方案,它在语义上并不相同,但通常可以使用。
你可以单引号 '{}' ';' 相反,但您必须以某种方式阻止 shell 本身解释这些字符。如果找到的数量很少,xargs 也会起作用。