如何在exec参数中使用pipe道来查找命令?
我正在尝试构build一个find命令来使用两个不同的可执行文件处理目录中的一堆文件。 不幸的是, -exec
查找不允许使用pipe道甚至\|
因为shell先解释这个字符。
这是特别是我想要做的(这不工作,因为pipe道结束查找命令):
find /path/to/jpgs -type f -exec jhead -v {} | grep 123 \; -print
尝试这个
find /path/to/jpgs -type f -exec sh -c 'jhead -v {} | grep 123' \; -print
或者,您可以尝试将您的exec语句embedded到sh脚本中,然后执行以下操作:
find -exec some_script {} \;
稍微不同的方法是使用xargs:
find /path/to/jpgs -type f -print0 | xargs -0 jhead -v | grep 123
我总是发现有点容易理解和适应(-print0和-0参数是处理包含空格的文件名所必需的)
这可能 (未testing)比使用-exec更有效,因为它会将文件列表传递给xargs,并且xargs确保jhead命令行不会太长。
使用-exec
,只能使用一些参数运行一个可执行文件,而不是任意的shell命令。 为了避免这种情况,可以使用sh -c '<shell command>'
。
请注意,使用-exec
是相当低效的。 对于find的每个文件,都必须再次执行该命令。 如果你能避免这种情况,效率会更高。 (例如,通过将grep
移动到-exec
之外或将find
的结果传送给Palminbuild议的xargs
)。
对这种types的任务使用find
命令可能不是最好的select。 我经常使用以下命令来查找包含请求信息的文件:
for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done
由于这个输出列表你不会:
find /path/to/jpgs -type f -exec jhead -v {} \; | grep 123
要么
find /path/to/jpgs -type f -print -exec jhead -v {} \; | grep 123
把你的grep放在find -exec的结果中。