管道将结果找到grep以便快速排除目录

ete*_*ewb 10 linux recursion grep find piping

我成功使用find创建当前子目录中所有文件的列表,不包括子目录"cache"中的文件.这是我的第一段代码:

find . -wholename './cach*' -prune -o -print
Run Code Online (Sandbox Code Playgroud)

我现在希望将它传递给grep命令.看起来应该很简单:

find . -wholename './cach*' -prune -o -print | xargs grep -r -R -i "samson"
Run Code Online (Sandbox Code Playgroud)

...但这会返回主要来自缓存目录的结果.我已经尝试删除了xargs引用,但是这可以达到你所期望的,在文件名的文本上运行grep,而不是在文件本身上运行.我的目标是在任何非缓存内容的文件中找到"samson".

我可能会在这个例子中使用doubled greps解决这个问题,但是我很好奇为什么这个单行程就像这样.我喜欢听到关于修改它的方法的想法,同时仍然使用这两个命令(因为这样做有速度优势).

(这是在CentOS 5,顺便说一句.)

new*_*rey 9

wholename比赛,可为什么它仍然包括"缓存"文件的原因.如果您在find包含"cache"文件夹的目录中执行该命令,它应该可以工作.如果没有,请尝试将其更改为-name '*cache*'.

此外,你不需要-r或者-R你的grep,它告诉它通过目录递归 - 但你正在测试单个文件.

您可以使用管道版本或单个命令更新命令:

find . -name '*cache*' -prune -o -print0 | xargs -0 grep -il "samson"
Run Code Online (Sandbox Code Playgroud)

要么

find . -name '*cache*' -prune -o -exec grep -iq "samson" {} \; -print
Run Code Online (Sandbox Code Playgroud)

注意,-l在第一个命令中告诉grep"列出文件"而不是匹配的行.所述-q在所述第二不相同; 它告诉grep安静地回应所以find然后只打印文件名.