如何在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的结果中。