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

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

How do I use a pipe in the exec parameter for a find command?

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

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

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

尝试这个

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

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

1
find -exec some_script {} \;

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

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

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

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


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

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


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

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

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

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

要么

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

将您的grep放在find -exec的结果上。


您可以使用另一种方式来完成此操作,但这也是相当的贫民窟。

使用shell选项extquote,您可以执行类似的操作来查找exec内容,然后将其传递给sh。

1
2
root@ifrit findtest # find -type f -exec echo ls $"|" cat \;|sh
filename

1
2
root@ifrit findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh
h

我只是想补充一下,因为至少我的可视化方式更接近OP最初在exec中使用管道的问题。


推荐阅读

    linux获取地址命令?

    linux获取地址命令?,地址,网络,信息,系统,设备,终端,命令,中心,管理,数字,lin

    linux的u盘启动命令?

    linux的u盘启动命令?,系统,电脑,工具,信息,软件,网上,名称,工作,设备,通用,从

    linux设置路由器命令?

    linux设置路由器命令?,网络,信息,代码,地址,电脑,工作,环境,系统,密码,路由,l

    基本linux命令面试题?

    基本linux命令面试题?,系统,情况,设备,实时,工具,分析,证书,时间,教育,认证,

    linux命令连接光驱?

    linux命令连接光驱?,系统,位置,设备,数据,电脑,服务,资料,盘中,智能,管理,Lin

    linuxlspv命令?

    linuxlspv命令?,系统,管理,软件,产品,统一,发行,技术,情况,环境,实时,aix查看

    linux下分区命令行?

    linux下分区命令行?,系统,工具,设备,信息,分区,情况,首次,名称,网络,命令,lin

    u进入linux命令行?

    u进入linux命令行?,系统,地址,服务,电脑,命令,管理,工作,首页,终端,目录,linu

    更改时间linux命令?

    更改时间linux命令?,时间,系统,命令,环境,网上,信息,资料,概念,位置,终端,lin

    linux命令行更改中文?

    linux命令行更改中文?,系统,环境,管理,国家,信息,软件,文化,设备,中文,命令,l

    linux打包zip命令?

    linux打包zip命令?,时间,文件,信息,名称,系统,技术,命令,文件夹,格式,目录,li

    linux的vsp命令?

    linux的vsp命令?,手机,系统,软件,状态,信息,设备,发行,平台,电脑,工作,如何在

    linux关机命令及例子?

    linux关机命令及例子?,系统,信息,命令,时间,代码,用户,表示,指令,方式,提示,l

    linux命令行模式清页?

    linux命令行模式清页?,工作,系统,命令,信息,地址,目录,内容,文件,操作,功能,l

    linux更改账户名命令?

    linux更改账户名命令?,密码,系统,代码,命令,基础,信息,软件,用户,用户名,账

    linux通常重启命令?

    linux通常重启命令?,系统,工作,设备,标准,网络,命令,服务,首要,意义,参数,lin

    linux删除第一行命令?

    linux删除第一行命令?,单位,系统,命令,标的,不了,数字,连续,名称,档案,文件,m

    linux运维命令必会吗?

    linux运维命令必会吗?,工作,系统,地址,基础,网络,人员,信息,技术,软件,环境,

    linux文件io命令?

    linux文件io命令?,系统,设备,时间,地址,平均,信息,服务,工具,报告,网络,嵌入

    linux命令行出现笑脸?

    linux命令行出现笑脸?,系统,图片,资料,电子,信息,不了,工作,时间,文件,命令,l