我想(递归地)查找文件名中包含“ABC”的所有文件,其中文件中还包含“XYZ”。我试过:
find . -name "*ABC*" | grep -R 'XYZ'
但它没有给出正确的输出。
答案1
这是因为grep
无法从标准输入读取文件名进行搜索。你正在做的是打印文件名字包含XYZ
.使用find
的-exec
选项代替:
find . -name "*ABC*" -exec grep -H 'XYZ' {} +
从man find
:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered. The string `{}'
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find.
[...]
-exec command {} +
This variant of the -exec action runs the specified command on
the selected files, but the command line is built by appending
each selected file name at the end; the total number of invoca‐
tions of the command will be much less than the number of
matched files. The command line is built in much the same way
that xargs builds its command lines. Only one instance of `{}'
is allowed within the command. The command is executed in the
starting directory.
如果您不需要实际的匹配行,而只需要包含至少一次该字符串的文件名列表,请改用以下命令:
find . -name "*ABC*" -exec grep -l 'XYZ' {} +
答案2
我发现以下命令是最简单的方法:
grep -R --include="*ABC*" XYZ
或添加-i
到不区分大小写的搜索:
grep -i -R --include="*ABC*" XYZ
答案3
… | grep -R 'XYZ'
没有意义。一方面,-R 'XYZ'
意味着递归地作用于XYZ
目录。另一方面,意味着在的标准输入中… | grep 'XYZ'
查找模式。\XYZ
grep
在 Mac OS X 或 BSD 上,grep
将视为XYZ
一种模式,并抱怨:
$ echo XYZ | grep -R 'XYZ'
grep: warning: recursive search of stdin
(standard input):XYZ
GNUgrep
不会抱怨。相反,它视为XYZ
一种模式,忽略其标准输入,并从当前目录开始递归搜索。
你想做的可能是
find . -name "*ABC*" | xargs grep -l 'XYZ'
...这类似于
grep -l 'XYZ' $(find . -name "*ABC*")
…两者都告诉我们在匹配的文件名中grep
查找。XYZ
但请注意,文件名中的任何空格都会导致这两个命令中断。您可以xargs
通过使用NUL作为分隔符来安全地使用:
find . -name "*ABC*" -print0 | xargs -0 grep -l 'XYZ'
但@terdon 使用的解决方案find … -exec grep -l 'XYZ' '{}' +
更简单、更好。
答案4
Linux 推荐:ll -iR | grep“文件名”
例如:Bookname.txt 然后使用 ll -iR | grep "书名" 或 ll -iR | grep“名称”或 ll -iR | grep“书”
我们可以使用部分文件名进行搜索。
这将列出当前文件夹和子文件夹中匹配的所有文件名