指定されたテキストを含むファイルを検索して削除する Linux コマンド

指定されたテキストを含むファイルを検索して削除する Linux コマンド

特定のテキストを含むファイルを削除するターミナルコマンドはありますか?

3 つのファイルがあり、そのうちのいくつかに「extract($_REQUEST)」というテキストが含まれているとします。

  • file-1.php: このファイルには「extract($_REQUEST)」というテキストが含まれています
  • file-2.txt: 私はしません
  • file-3.html: このファイルには「extract($_REQUEST)」というテキストが含まれています

探しているコマンドは、ファイルfile-1.phpとを削除しますfile-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

注: テスト済みで問題なく動作しました

関連情報