特定のテキストを含むファイルを削除するターミナルコマンドはありますか?
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
注: テスト済みで問題なく動作しました