查找文件名中包含字符串且文件内包含不同字符串的文件?

查找文件名中包含字符串且文件内包含不同字符串的文件?

我想(递归地)查找文件名中包含“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'查找模式。\XYZgrep

在 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“书”

我们可以使用部分文件名进行搜索。

这将列出当前文件夹和子文件夹中匹配的所有文件名

相关内容