在文件中搜索模式并删除

search for pattern in files and delete

我有一个包含文本文件的目录,其中包含如下原始 http 请求

POST /test HTTP/1.1
Host: host.com
Content-Type: application/x-www-form-urlencoded
Accept-Language: en-US, gHNEY;q=0.9, *;q=0.5
Accept-Charset: utf-8, iso-8859-1;q=0.5, 3AG19;q=0.2, *;q=0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5)
Accept: */*, text/XppPa

param1=ffff&

如您所见,名为 2b0c9d9254abb4a775023177380c2598.txt 的文件是 url 的 md5sum,现在情况并非如此,但我想提一下

我想要的是搜索 not containing parameters 的文件并将其删除,这样该目录中的其余文件将只是包含参数

的文件

我尝试的是在那些包含参数的文件中找到的 grep 唯一值,我发现常见的是 char &,它写在参数值

旁边

所以我尝试了以下命令,但没有用 grep -lrIvE '&' . | xargs -0 rm -f -- 结果是 ./2b0c9d9254abb4a775023177380c2598.txt'$'\n': File name too long

当我在 grep 中添加大写字母 Z 时,删除了所有文件

所以有没有办法做到这一点,如果我可以过滤包含唯一参数的请求(文件),那就太棒了

谢谢

注意:如果没有 grep-Z 选项,则不能使用 xargs-0 选项。记录分隔符不匹配。

您的问题是 grep -v 匹配所有不包含 & 的行。你所有的文件都至少有一个。您可以搜索匹配的行,而不是搜索不匹配的行,仅当找到 none 时才删除文件:

find . -type f -print0 | while IFS= read -r -d '' f; do
  grep -Iq '&' "$f" || printf 'rm -f %s\n' "$f"
done

printf 'rm -f %s\n' "$f" 替换为 rm -f "$f" 一旦您确信它可以满足您的要求。