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

注意:經過測試,效果很好

相關內容