我正在尝试在文件中找到字符串的所有实例 - 我正在使用find并且它工作得很好但是,它不仅返回文件,而且还返回文件中该字符串的每个实例,这导致了一个巨大的长列表我真的只想要文件名。
我正在使用:
find . -name '*.php' -exec grep -i 'MATCH' {} \; -print
这将显示MATCH的每个实例,然后显示文件名,然后显示下一批和文件名,如下所示:
MATCH
MATCH
MATCH
./filename
MATCH
MATCH
MATCH
./filename2
我尝试将GREP更改为:
find . -name '*.php' -exec grep -H -i 'MATCH' {} \; -print
然后这给了我:
./filename: MATCH
./filename: MATCH
./filename: MATCH
./filename2: MATCH
./filename2: MATCH
./filename2: MATCH
然而,这仍然会导致显示相同数量的线条,所有线条都略有不同。
我尝试将GREP更改为:
find . -name '*.php' -exec grep -l -i 'MATCH' {} \; -print
然后这给了我:
./filename
./filename
./filename
./filename2
./filename2
./filename2
理想情况下,我想要像:
./filename
./filename2
只列出每个匹配一次的文件而不管每个文件出现多少次 - 可以这样做吗?
答案 0 :(得分:2)
使用grep:
提供的功能-l, - files-with-matches仅打印包含匹配项的FILE的名称 -R,-r, - 递归相当于--directories = recurse
--include = FILE_PATTERN仅搜索与FILE_PATTERN相匹配的文件 -i, - ignore-case忽略大小写区别
即
grep -ril --include="*.php" 'MATCH' .
答案 1 :(得分:0)
问题不在于grep
,您告诉 find
打印每个文件名:
find . -name '*.php' -exec grep -l -i 'MATCH' {} \; -print
注意最后的-print
。只需删除它:
find . -name '*.php' -exec grep -l -i 'MATCH' {} \;
查找
$ echo 'foo' > file1
$ echo 'foo' > file2
$ find . -name 'file*' -exec grep -l -i foo {} \; -print
./file1
./file1
./file2
./file2
$ find . -name 'file*' -exec grep -l -i foo {} \;
./file1
./file2