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

时间:2009-03-27 10:08:28

标签: shell grep

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

grep keyword <all files specified in files.txt>

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

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

5 个答案:

答案 0 :(得分: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”。这就是为什么你的文件名不应该有空格的好理由。

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

答案 1 :(得分:2)

DevSolar的两个答案都在工作(在Linux Ubuntu上测试过),但如果有很多文件,xargs版本更可取,因为它可以避免进入命令行长度限制。

这样:

cat files.txt | xargs grep keyword

是要走的路

答案 2 :(得分: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表示使用快速字符串匹配而不是慢速正则表达式匹配

答案 3 :(得分:0)

bashksh&amp; zsh版本:

grep keyword $(<files.txt)

答案 4 :(得分:-2)

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

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