Linux-Befehl zum Suchen und Löschen von Dateien, die einen bestimmten Text enthalten

Linux-Befehl zum Suchen und Löschen von Dateien, die einen bestimmten Text enthalten

Gibt es einen Terminalbefehl zum Löschen von Dateien, die einen bestimmten Text enthalten?

Nehmen wir an, ich habe drei Dateien und einige davon enthalten den Text „extract($_REQUEST)“:

  • file-1.php: Diese Datei enthält den Text „extract($_REQUEST)“
  • file-2.txt: Ich tu nicht
  • file-3.html: Diese Datei enthält den Text „extract($_REQUEST)“

Der gesuchte Befehl löscht die Dateien: file-1.phpund file-3.html.


AKTUALISIEREN: Die Datei sollte die Datei löschenNUR WENN"extract($_REQUEST)" ist die einzige Textzeile in der Datei. Siehe die Beispiele unten:

  • file-4.php: Diese DateiNURenthält den Text "extract($_REQUEST)"
  • file-5.php: Diese Datei enthält den Text „extract($_REQUEST)“und andere Textzeilen

Dann löscht der Befehl file-4.php, und der Befehl löscht nicht file-5.php.

Antwort1

find  . -maxdepth 1 -type f \
  -exec fgrep -q  'extract($_REQUEST)' '{}' ';' \ 
  -not -exec fgrep -vq  'extract($_REQUEST)' '{}' ';' \ 
  -delete
  • find .Durchsuchen Sie das aktuelle Verzeichnis
  • -maxdepth 1und keine Unterverzeichnisse
  • -type fDateien finden
  • -execund führen Sie für jeden diesen Test aus
    • fgrepeine einfache Zeichenfolgensuche
      • -q ohne sichtbare Ausgabe
      • 'extract($_REQUEST)'für diese Zeichenfolge
      • '{}'in der Datei, die Sie gefunden haben
      • ';' [Ende der Ausführung]
  • -notnicht der nächste Test
    • -execnochmal ausführen
      • fgrepfgrep nochmal
        • -vqaber dieses Mal suchen Sie nach nicht übereinstimmenden Zeilen
        • 'extract($_REQUEST)'gleiches Muster zu suchen
        • '{}'in der Datei
    • ';' [Ende der Ausführung]
  • -deleteLösche sie

Dies funktioniert, weil exec auch ein Test ist und wenn fgrep eine Übereinstimmung findet, ist der Test erfolgreich und der Löschvorgang wird ausgeführt. Wenn grep „false“ zurückgibt, wird der Löschvorgang nicht durchgeführt.

Antwort2

grep -FRl 'extract($_REQUEST)' | xargs rm -fv
  • grep- Text in Dateien suchen.
  • -F- Behandeln Sie die Zeichenfolge wie sie ist und ignorieren Sie mögliche reguläre Ausdrücke.
  • -R- rekursive Suche.
  • -l- nur Dateinamen drucken.
  • xargs- geben Sie die Ausgabe an das nächste Programm weiter.
  • rm- entfernen.
  • -f- Gewalt anwenden (nicht fragen „Sind Sie sicher?“).
  • -v- ist optional. Es werden die entfernten Dateien gedruckt.

AKTUALISIEREN:

Um nur die Dateien mit dem exakten Text zu löschen, empfehle ich, auch die Anzahl der Zeichen in der Datei zu überprüfen.

for i in $(grep -FRl 'extract($_REQUEST)'); do [[ $(cat $i | wc -c) == "19" ]] && rm -fv $i; done
  • wc -c- zählt die Zeichen in der Datei. Da das von Ihnen angegebene Beispiel ( extract($_REQUEST)) 19 Zeichen lang ist (einschließlich Zeilenumbruchzeichen), habe ich diese Zahl in meinem Beispiel verwendet. Sie können sie gerne an Ihre Situation anpassen.

Antwort3

Befehl

find  . -maxdepth 1 -type f -exec grep -l  "string_to_be_searched" {} \;|awk '{print $1}'| sed "s/\.\///g"| awk '{print "rm -rvf" " " $1}'| sh

Hinweis: Getestet und es hat gut funktioniert

verwandte Informationen