如何在exec参数中的管道中使用find命令?

时间:2020-03-05 18:53:13  来源:igfitidea点击:

我正在尝试构造一个find命令,以使用两个不同的可执行文件来处理目录中的一堆文件。不幸的是,find中的-exec不允许使用管道,甚至不允许使用\,因为shell首先会解释该字符。

这是我要尝试执行的操作(此操作行不通,因为管道结束了find命令):

find /path/to/jpgs -type f -exec jhead -v {} | grep 123 \; -print

解决方案

回答

由于这会输出一个列表,我们不会:

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的结果上。

回答

试试这个

find /path/to/jpgs -type f -exec sh -c 'jhead -v {} | grep 123' \; -print

或者,我们可以尝试将exec语句嵌入sh脚本中,然后执行以下操作:

find -exec some_script {} \;

回答

使用-exec只能运行带有某些参数的单个可执行文件,而不能运行任意的shell命令。为了避免这种情况,我们可以使用sh -c'<shell command>'

请注意,使用-exec是非常低效的。对于找到的每个文件,必须再次执行该命令。如果我们可以避免这种情况,它将更有效率。 (例如,按照Palmin的建议,通过将grep移动到-exec之外,或者将find的结果传递给xargs。)

回答

稍微不同的方法是使用xargs:

find /path/to/jpgs -type f -print0 | xargs -0 jhead -v | grep 123

我总是发现它更容易理解和适应(使用-print0和-0参数来处理包含空格的文件名)

这可能(未经测试)比使用-exec更有效,因为它将通过管道将文件列表传递给xargs,并且xargs确保jhead命令行不会太长。