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

JPa*_*shs 0 command-line command delete

是否有一个终端命令来删除包含给定文本的文件?

假设我有三个文件,其中一些包含文本“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:此文件JUST包含文本“提取物($ _ REQUEST)”
  • file-5.php: 该文件包含文本“extract($_REQUEST)”和其他文本行

然后命令将删除file-4.php并且不会删除file-5.php

Jas*_*sen 5

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

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