0

我知道这个问题对你们中的一些人来说可能很简单,但我尝试了几种组合并在谷歌上搜索了很多,但没有成功。

问题:我有一堆具有给定文件名的文件,但在不同的目录中。

例如,我在目录 a、b、c、d 中有一个名为“THEFILE.txt”的文件。我在一个将这些作为子目录的目录中。在每个 'THEFILE.txts' 中,我都在寻找具有以下模式的行:'Has this property blah blah blah _apple'。所以我对这条线的确定是它以'Has this property'开头并以'_apple'结尾。

我试过了:

  1. 寻找 。-name 'THEFILE.txt' -exec grep -l '有这个属性' {} \; 这行得通,但我得到的每一行都带有“有这个属性”。我只想要最后有 _apple 的

  2. 所以我尝试了:找到 . -name 'THEFILE.txt' -exec grep -l '有这个属性*_apple' {} \; //不起作用,从我的谷歌搜索来看,我不希望它。

  3. 所以,接下来我尝试了: find . -name 'THEFILE.txt' -exec grep -l '有这个属性[!-~]*_apple' {} \; //不工作

  4. 寻找 。-name 'THEFILE.txt' -exec grep '有这个属性' {} \; | grep '_apple$' //这会输出所有匹配的行,但不输出文件名

  5. 寻找 。-name 'THEFILE.txt' -exec grep '有这个属性' {} \; | grep -l '_apple$' //说文件是标准输入

预期输出:(比如文件 a 和 c 有所需的行)

./a/THEFILE.txt
./c/THEFILE.txt
4

2 回答 2

1

你的尝试 2. 几乎就在那里。稍作调整:

find . -name THEFILE.txt -exec grep -q '^Has this property.*_apple$' '{}' ';' -print

它比递归 grepping 更精确,更简单(无管道)。

上述工作(而不是grep -l)的原因是该-exec操作评估其命令的退出状态。 如果它找到了它所寻找的东西,它将grep以 0 状态(即 )退出,这将产生yield ,这反过来将导致下一个动作()也被采取。true-exectrue-print

于 2013-10-08T13:59:33.293 回答
0

如果您只想要文件名,您可以只使用 grep -r 并将其通过管道传输到 awk 中。

grep -r "_apple$" . | awk -F: '{print $1}'

于 2013-10-08T01:15:02.080 回答