有没有办法在运行-exec之前导入参数列表以查找?

时间:2016-04-22 16:17:07

标签: bash find xargs

我正在编写一个在.php文件上执行grep的脚本,但我也希望它对.php文件中包含的任何文件执行相同的grep。

我正在使用PHP函数

get_included_files();

生成包含文件的列表(此列表随后保存到文件中)我想让我的find在find找到的.php文件和我文件列表中列出的所有文件上执行grep。

我尝试过以下方法:

find -iname \*.php -exec grep 'foo' $(cat list.txt) {} +

find -iname \*.php | xargs -I {} grep 'foo' $(cat list.txt) {}

在这两种情况下,我得到:

/ usr / bin / find:参数列表太长

/ usr / bin / xargs:参数列表太长

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

我认为您可以首先构建加入列表,然后使用xargs将其提供给grep来避免您的问题:

find -iname \*.php | cat list.txt - | xargs grep 'foo'

请注意-参数中的cat引用此上下文中的stdin,即find返回的文件列表。

如果您想避免重复,也可以在其中插入sort -u

我对您的错误的假设是list.txt本身的内容足以打破grep call; findxargs都会检测到并拒绝启动命令,而不考虑其参数。

答案 1 :(得分:0)

在您的命令中, list.txt 中的所有文件名首先被传递给find / xargs作为位置参数。在您的情况下,此文件包含的名称多于OS的限制。

所以只需为 list.txt 中的每个名称运行grep:

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    grep 'foo' "$line"
done < list.txt