如何在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命令行不会太长。