使用文件中的行作为grep的文件名?

Ric*_*cho 3 shell grep

我有一个文件,其中包含文件名(以及它们的完整路径),我想在所有文件中搜索一个单词.一些伪代码来解释:

grep keyword <all files specified in files.txt>
Run Code Online (Sandbox Code Playgroud)

要么

cat files.txt > grep keyword
cat files txt | grep keyword
Run Code Online (Sandbox Code Playgroud)

问题是我只能通过grep来搜索文件名,而不是实际文件的内容.

Dev*_*lar 7

cat files.txt | xargs grep keyword
Run Code Online (Sandbox Code Playgroud)

要么

grep keyword `cat files.txt`
Run Code Online (Sandbox Code Playgroud)

或(相当于以前但更难以阅读)

grep keyword $(cat files.txt)
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.

陷阱:

  • 如果files.txt包含带空格的文件名,则任何一种解决方案都会出现故障,因为"这是一个filename.txt"将被解释为四个文件,"This","is","a"和"filename.txt".你不应该在你的文件名中有空格的一个很好的理由.

    • 有很多方法,但没有一个是微不足道的.(找到... -print0/xargs -0就是其中之一.)
  • 第二个(cat)版本可能会导致命令行很长(超出环境限制时可能会失败).第一个(xargs)版本自动处理长输入; xargs提供了几个控制细节的选项.