我有一些包含特定字符串的文件。我想要做的是,搜索文件的位置;如果文件存在grep的模式;如果是真的,做点什么。
find -iname file.xxx| xargs -I {} if grep -Fq "string" {} ; then echo {} ; fi
问题是:
xargs
未使用if语句。echo {}
未提供文件名,而是提供{}
。如何解决这些问题?
答案 0 :(得分:19)
尝试通过这样的shell运行命令:
$ find -iname file.xxx |
> xargs -I {} bash -c 'if grep -Fq "string" {} ; then echo {} ; fi'
原始命令被引号和bash -c
包围。
答案 1 :(得分:5)
在对sh:
的调用中包装if语句find -iname file.xxx | xargs -I {} sh -c 'grep -Fq "string" {} && { echo {}; }'
使用while循环而不是xargs
find -iname file.xxx | while read -r file; do
if grep -Fq "$file"; then
# do something
echo "$file"
fi
done
我假设你想做的不仅仅是回显文件名。如果您正在尝试这样做,请使用grep的-l
选项:
find -iname file.xxx | xargs grep -Fl "string"
答案 2 :(得分:0)
首先,if
是一个bash命令,没有可执行程序。另一方面,xargs
需要一个独特的计划。
其次,;
字符可能会拆分您的命令。你必须逃脱它们才能让它们通过xargs。
为了避免这一切,我建议如下:
for i in `find -iname file.xxx` ; do grep -Fq "string" $i && echo $i ; done