什么简洁的我可以使用命令查找所有不包含文本字符串的文件吗?
我尝试了这个(使用 -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'
是exec
ut ,如果结果是false
则整个表达式! -exec grep -q 'PATTERN'
计算为 ,true
并且文件名是print
ed 。
答案4
我想你正在寻找像这样的命令
find . -type f -execdir grep -q -v shared.php {} \; -print
该选项-q
使grep
退出,使用后-execdir
需要-print
打印找到的文件。