【问题标题】:search for pattern in files and delete在文件中搜索模式并删除
【发布时间】:2021-10-15 15:07:56
【问题描述】:

我有一个目录包含文本文件,其中包含如下原始 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 匹配所有不包含& 的行。而且您的所有文件都至少有一个。

标签: bash awk grep


【解决方案1】:

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

您的问题是grep -v 匹配所有不包含& 的行。而且您的所有文件都至少有一个。除了搜索不匹配的行之外,您还可以搜索匹配的行并仅在找不到文件时才删除文件:

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"

【讨论】:

  • 为什么是循环? find . -type f ! -exec grep -q '&' {} \; -exec echo rm -rf {} + 做同样的事情。
  • @oguzismail 让测试倒退;尝试find . -type f \( -exec grep -q '&' {} \; -o -print \),如果打印出正确的名称,请将-print 替换为-delete
  • @Gordon 是的,谢谢。更新了它,括号不是必需的。
  • @oguzismail 啊,我明白了;否定-exec grep 应该可以正常工作。
  • @RenaudPacalet 我的版本在-exec grep-delete 之间有一个-o(“或”)运算符;隐含的“and”的优先级高于-o,因此如果没有括号,它将是:(它是一个文件并且包含“&”)或删除它——这将删除不是文件的所有内容或不'不包含“&”。
猜你喜欢
  • 2012-09-27
  • 2012-10-31
  • 2016-05-03
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
相关资源
最近更新 更多