特定のテキストを含むファイルを削除するターミナルコマンドはありますか?
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
注:テスト後の効果は非常に良いです。