我知道这个问题可能对你们中的一些人来说很简单,但我已经尝试了几种组合并且搜索了很多内容,没有成功。
问题:我有一堆具有给定文件名的文件,但是在不同的目录中。
例如,我在目录a,b,c,d中有一个名为'THEFILE.txt'的文件。我在一个目录中,将这些作为子目录。在每个'THEFILE.txts'中,我正在寻找具有以下模式的行:'有这个属性等等等等等等等等。所以我肯定知道这条线是它以'拥有此属性'开头并以'_apple'结尾。
我试过了:
找到。 -name'THEFILE.txt'-exec grep -l'具有此属性'{} \; 这有效,但我得到的每一行都有'有这个属性'。我只想在最后使用_apple
所以我尝试过: 找 。 -name'THEFILE.txt'-exec grep -l'有这个属性* _apple'{} \; //不起作用,从我的谷歌搜索中,我不指望它。
所以,接下来我尝试了: 找 。 -name'THEFILE.txt'-exec grep -l'有这个属性[! - 〜] * _ apple'{} \; //不工作
找到。 -name'THEFILE.txt'-exec grep'具有此属性'{} \; | grep'_apple $' //输出所有匹配的行,但不输出文件名
找到。 -name'THEFILE.txt'-exec grep'具有此属性'{} \; | grep -l'_apple $' //说文件是stdin
预期输出:(假设文件a和c具有所需的行)
./a/THEFILE.txt
./c/THEFILE.txt
答案 0 :(得分:1)
你的尝试2.几乎就在那里。稍加调整:
find . -name THEFILE.txt -exec grep -q '^Has this property.*_apple$' '{}' ';' -print
它比递归grepping和更简单(没有管道)更精确。
上述原因(与grep -l
相反)的原因是-exec
动作评估其命令的退出状态。
grep
将以0状态(true
)退出,如果它找到所查找的内容,则-exec
会产生true
,这反过来会导致下一个行动(-print
)也将采取行动。
答案 1 :(得分:0)
如果你只想要文件名,你可以使用grep -r,然后将它管道输入awk。
grep -r "_apple$" . | awk -F: '{print $1}'