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,顺便说一句.)
该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然后只打印文件名.