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 nichtfile-3.html
: Diese Datei enthält den Text „extract($_REQUEST)“
Der gesuchte Befehl löscht die Dateien: file-1.php
und 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 1
und keine Unterverzeichnisse-type f
Dateien finden-exec
und führen Sie für jeden diesen Test ausfgrep
eine einfache Zeichenfolgensuche-q
ohne sichtbare Ausgabe'extract($_REQUEST)'
für diese Zeichenfolge'{}'
in der Datei, die Sie gefunden haben';'
[Ende der Ausführung]
-not
nicht der nächste Test-exec
nochmal ausführenfgrep
fgrep nochmal-vq
aber dieses Mal suchen Sie nach nicht übereinstimmenden Zeilen'extract($_REQUEST)'
gleiches Muster zu suchen'{}'
in der Datei
';'
[Ende der Ausführung]
-delete
Lö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