it-swarm.cn

如何在exec参数中使用管道来查找命令?

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

这是我正在尝试做的事情(由于管道结束了find命令,因此无效):

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

试试这个

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

或者,您可以尝试将您的exec语句嵌入到sh脚本中,然后执行:

find -exec some_script {} \;
78
Martin Marconcini

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

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

我总是觉得更容易理解和适应(-print0和-0参数是处理包含空格的文件名所必需的)

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

12
Palmin

使用-exec,您只能使用一些参数运行单个可执行文件,而不是任意Shell命令。为了避免这种情况,你可以使用sh -c '<Shell command>'

请注意,使用-exec效率很低。对于找到的每个文件,必须再次执行该命令。如果你能避免这种情况会更有效率。 (例如,通过在-exec之外移动grep或将find的结果传递给xargs,如 Palmin 所示。)

3
mweerden

对这种类型的任务使用find命令可能不是最好的选择。我经常使用以下命令查找包含所请求信息的文件:

for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done
3
Dimitar

因为这会输出一个列表,你不会:

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

1
Xetius

还有另一种方法可以做到,但它也是非常贫民窟。

使用Shell选项extquote你可以做类似的事情,以便查找exec的东西,然后将其传递给sh。

[email protected] findtest # find -type f -exec echo ls $"|" cat \;|sh
filename


[email protected] findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh
h

我只是觉得我要补充一点,因为至少我想象它的方式,它更接近OP在exec中使用管道的原始问题。

0
linuxgeek