我正在编写一个在.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:参数列表太长
任何帮助将不胜感激
答案 0 :(得分:0)
我认为您可以首先构建加入列表,然后使用xargs
将其提供给grep
来避免您的问题:
find -iname \*.php | cat list.txt - | xargs grep 'foo'
请注意-
参数中的cat
引用此上下文中的stdin,即find
返回的文件列表。
如果您想避免重复,也可以在其中插入sort -u
。
我对您的错误的假设是list.txt
本身的内容足以打破grep call
; find
和xargs
都会检测到并拒绝启动命令,而不考虑其参数。
答案 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