使用find递归并仅返回匹配的文件名

时间:2018-04-11 12:15:56

标签: grep find

我正在尝试在文件中找到字符串的所有实例 - 我正在使用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

只列出每个匹配一次的文件而不管每个文件出现多少次 - 可以这样做吗?

2 个答案:

答案 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