Linux命令查找并删除包含给定文本的文件

Linux命令查找并删除包含给定文本的文件

是否有终端命令可以删除包含给定文本的文件?

假设我有三个文件,其中一些包含文本“extract($_REQUEST)”:

  • file-1.php:该文件包含文本“extract($_REQUEST)”
  • file-2.txt: 我不
  • file-3.html:该文件包含文本“extract($_REQUEST)”

我正在寻找的命令将删除文件:file-1.phpfile-3.html


更新: 该文件应该删除该文件除非“extract($_REQUEST)”是文件中唯一的文本行。请参阅下面的示例:

  • file-4.php: 这个文件只是包含文本“extract($_REQUEST)”
  • file-5.php:该文件包含文本“extract($_REQUEST)”以及其他文本行

然后命令会删除file-4.php,不会删除file-5.php

答案1

find  . -maxdepth 1 -type f \
  -exec fgrep -q  'extract($_REQUEST)' '{}' ';' \ 
  -not -exec fgrep -vq  'extract($_REQUEST)' '{}' ';' \ 
  -delete
  • find .搜索当前目录
  • -maxdepth 1并且没有子目录
  • -type f查找文件
  • -exec并为每个执行此测试
    • fgrep纯字符串搜索
      • -q 没有可见的输出
      • 'extract($_REQUEST)'对于这个字符串
      • '{}'在你找到的文件中
      • ';' [执行结束]
  • -not不是下一个测试
    • -exec再次执行
      • fgrep再次 fgrep
        • -vq但这一次寻找不匹配的行
        • 'extract($_REQUEST)'寻找相同的模式
        • '{}'在文件中
    • ';' [执行结束]
  • -delete删除它们

这是有效的,因为 exec 也是一个测试,当 fgrep 找到匹配项时,测试成功并且删除运行。如果 grep 返回 false,则删除未完成。

答案2

grep -FRl 'extract($_REQUEST)' | xargs rm -fv
  • grep- 搜索文件中的文本。
  • -F- 按原样对待字符串,忽略可能的正则表达式。
  • -R- 递归搜索。
  • -l- 仅打印文件名。
  • xargs- 将输出提供给下一个程序。
  • rm- 消除。
  • -f- 强制(不要问“你确定吗?”)。
  • -v- 是可选的,它将删除已删除的文件。

更新:

为了仅删除具有精确文本的文件,我建议还检查文件中的字符数。

for i in $(grep -FRl 'extract($_REQUEST)'); do [[ $(cat $i | wc -c) == "19" ]] && rm -fv $i; done
  • wc -c- 计算文件中的字符数。由于您提供的示例 ( extract($_REQUEST)) 的长度为 19 个字符(包括换行符),因此我在示例中使用了这个数字,请随意更改它以适合您的情况。

答案3

命令

find  . -maxdepth 1 -type f -exec grep -l  "string_to_be_searched" {} \;|awk '{print $1}'| sed "s/\.\///g"| awk '{print "rm -rvf" " " $1}'| sh

注:经过测试,效果很好

相关内容