3

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

grep keyword <all files specified in files.txt>

或者

cat files.txt > grep keyword
cat files txt | grep keyword

问题是我只能让 grep 搜索文件名,而不是实际文件的内容。

4

5 回答 5

7
cat files.txt | xargs grep keyword

或者

grep keyword `cat files.txt`

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

grep keyword $(cat files.txt)

应该做的伎俩。

陷阱:

  • 如果 files.txt 包含带空格的文件名,则任何一种解决方案都会出错,因为“This is a filename.txt”将被解释为四个文件,“This”、“is”、“a”和“filename.txt”。永远不要在文件名中包含空格的一个很好的理由。

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

于 2009-03-27T10:11:21.417 回答
2

DevSolar 的两个答案都有效(在 Linux Ubuntu 上测试),但如果可能有很多文件,xargs 版本更可取,因为它将避免遇到命令行长度限制。

所以:

cat files.txt | xargs grep keyword

是要走的路

于 2009-03-27T10:23:16.333 回答
2
tr '\n' '\0' <files.txt | LANG=C xargs -r0 grep -F keyword
  • tr 将使用 NUL 字符分隔名称,以便空格不重要(注意 xargs 的相应 -0 选项)。
  • xargs -r 将为“大量”文件启动单个 grep 进程,但如果没有文件,则不会启动任何 grep 进程。
  • LANG=C 表示使用快速例程进行匹配,而不是使用慢速语言环境的例程
  • grep -F 表示使用快速字符串匹配而不是慢速正则表达式匹配
于 2009-03-27T14:59:53.643 回答
0

bash, ksh&zsh版本:

grep keyword $(<files.txt)
于 2017-04-02T14:52:42.880 回答
-2

上次创建 bash shell 脚本的时间很长,但是您可以将第一个 grep 的结果(查找所有文件名的那个)存储在一个数组中并对其进行迭代,发出更多的 grep 命令。

一个好的起点应该是 bash 脚本指南。

于 2009-03-27T10:10:57.207 回答