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

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

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

我尝试了这个(使用 -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

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

grep -rL shared.php .

答案2

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,则它是所需的文件,因此我们从输出中删除第一列,即文件名。

答案3

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

你可以像find这样使用grep

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

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

答案4

我想你正在寻找像这样的命令

find . -type f -execdir grep -q -v shared.php {} \; -print

该选项-q使grep退出,使用后-execdir需要-print打印找到的文件。

相关内容