【发布时间】:2009-03-27 10:08:27
【问题描述】:
我有一个包含文件名(以及它们的完整路径)的文件,我想在所有文件中搜索一个单词。 一些伪代码来解释:
grep keyword <all files specified in files.txt>
或
cat files.txt > grep keyword
cat files txt | grep keyword
问题是我只能通过 grep 来搜索文件名,而不是实际文件的内容。
【问题讨论】:
我有一个包含文件名(以及它们的完整路径)的文件,我想在所有文件中搜索一个单词。 一些伪代码来解释:
grep keyword <all files specified in files.txt>
或
cat files.txt > grep keyword
cat files txt | grep keyword
问题是我只能通过 grep 来搜索文件名,而不是实际文件的内容。
【问题讨论】:
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”。文本”。永远不要在文件名中包含空格的一个很好的理由。
第二个 (cat) 版本可能会导致很长的命令行(超出环境限制时可能会失败)。第一个(xargs)版本自动处理长输入; xargs 提供了几个选项来控制细节。
【讨论】:
DevSolar 的两个答案都有效(在 Linux Ubuntu 上测试),但如果文件很多,xargs 版本更可取,因为它可以避免遇到命令行长度限制。
所以:
cat files.txt | xargs grep keyword
要走的路
【讨论】:
tr '\n' '\0' <files.txt | LANG=C xargs -r0 grep -F keyword
【讨论】:
bash、ksh & zsh 版本:
grep keyword $(<files.txt)
【讨论】:
上次创建 bash shell 脚本的时间很长,但您可以将第一个 grep 的结果(查找所有文件名的那个)存储在一个数组中并对其进行迭代,发出更多的 grep 命令。
一个好的起点应该是 bash 脚本指南。
【讨论】: