如何找到所有不包含文本字符串的文件?


40

我可以使用什么简洁的命令来查找所有不包含文本字符串的文件?

我没有运气尝试过这个(使用-v反转grep的参数):

find . -exec grep -v -l shared.php {} \;

有人说这行得通:

find . ! -exec grep -l shared.php {} \;

但这似乎对我不起作用。

此页面包含以下示例:

find ./logs -size +1c  > t._tmp
while read filename
do
     grep -q "Process Complete" $filename
     if [ $? -ne 0 ] ; then
             echo $filename
     fi
done < t._tmp
rm -f t_tmp

但这很麻烦,而且一点也不简洁。

ps:我知道grep -L *可以做到这一点,但是我真正想知道的是如何将find命令与grep结合使用以排除文件。

pss:另外,我不确定如何使grep包含带有grep -L *语法的子目录,但是我仍然想知道如何在find:)中使用它。


1
您编写的第一个命令在我的计算机上运行良好。您正在使用什么版本的查找?而且,由于我们的话,可能指定UNIX你运行..
rahmu

@rahmu,此命令几乎总是无法按您期望的那样工作。您可能有一个非常具体的案例。请参阅unix.stackexchange.com/questions/339619/…–
sgnsajgon

Answers:


8
find . -type f | xargs grep -H -c 'shared.php' | grep 0$ | cut -d':' -f1    

要么

find . -type f -exec grep -H -c 'shared.php' {} \; | grep 0$ | cut -d':' -f1

在这里,-c如果计数为0,则计算文件中的匹配行数(使用),然后计算所需的文件数,因此我们从输出中剪切出第一列(即文件名)。



@吉尔斯是的,我同意你的看法。我为他的答案+1。
2011年

6
这不仅“非常复杂”,而且是错误的,因为它还会列出所有包含与模式匹配的10行的倍数的文件。即使grep已修复,也仍将假定没有文件名包含:换行符 ...
don_crissti 2015年

@don_crissti,谢谢提及!尽管如此,除非您使用大量复制粘贴代码,否则上述解决方案是一个不错的nice头。
Ufos

@Ufos-我真的没有收到您的评论...这是错误的。无论如何,如果您觉得它像个“真正的头”,请随时使用它
don_crissti 16/10/13

56

如果将-v -l(任何行不匹配的-L文件)更改为(没有行匹配的文件),您的查找应该起作用,但是您也可以使用grep的递归(-r)选项:

grep -rL shared.php .

哪个发现应该工作?
cwd

@Kevin-对不起,find . -exec grep -v -l shared.php {} \;(以及我尝试过的所有其他变体)对我不起作用。我使用的是OS X,但我认为这并不重要。我给了您+1,因为我忘记了该-r选项。
cwd

@cwd我知道这很旧,但是我想把它留给以后的读者使用:您使用OS X的事实确实有所作为。Mac OSX使用FreeBSD命令。这里的大多数人都采用Linux(GNU)样式的命令。他们有不同的论据,不同的处理细节的方式。
Rich Homolka

截至2016年,OSX似乎确实支持-L
David Moles

@kevin我说的是,不是的。:)并非有人明确表示没有,但是评论令人困惑(我当然也遇到过其他OS X / BSD与GNU问题)。
David Moles'17

4

我知道grep -L *可以做到这一点,但是我真正想知道的是如何find结合使用该命令grep来排除文件

您可以使用findgrep这样的:

find . -type f ! -exec grep -q 'PATTERN' {} \; -print

-print仅在前一个表达式:! -exec ... {}计算为时才执行此处true
因此,对于找到的每个文件,如果结果grep -q 'PATTERN'execute,则false整个表达式的! -exec grep -q 'PATTERN'值为,true文件名为printed。


2
那是标准和便携式的好处。
斯特凡Chazelas

grep -L尽管与GNU有所不同,因为它还将在列表中包含不可读的文件。
斯特凡Chazelas


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.