Ich möchte alle Dateien löschen, die die Zeichenfolge enthalten foo
. Wie kann ich das mit bash unter Linux machen?
linux
command-line
bash
find
Kitsos
quelle
quelle
foo
(zBmyfoo.jpg
) enthält , oder Dateien, die die Bytesequenz enthaltenfoo
(einschließlich Binärdateien, die zufällig diese Bytesequenz enthalten)?Antworten:
Hier ist ein sicherer Weg:
-l
druckt Dateinamen von Dateien, die dem Suchmuster entsprechen.-r
führt eine rekursive Suche nach dem Musterfoo
im angegebenen Verzeichnis durch.
. Wenn dies nicht funktioniert, versuchen Sie es-R
.-I
(großi
) bewirkt, dass Binärdateien wie PDFs übersprungen werden.-Z
Stellt sicher, dass Dateinamen mit Nullen (dh mit Nullen) abgeschlossen sind, damit ein Name, der Leerzeichen enthält, nicht falsch interpretiert wird (dh als mehrere Namen anstelle von einem).xargs -0
füttert die Dateinamen vongrep
bisrm -f
und trennt die Wörter durch Null (nul) Bytes (merken Sie sich die-Z
Option vongrep
).--
wird oft vergessen, aber es ist sehr wichtig, das Ende der Optionen zu markieren und das Entfernen von Dateien zu ermöglichen, deren Namen mit beginnen-
.Wenn Sie sehen möchten, welche Dateien gelöscht werden sollen, entfernen Sie einfach das
| xargs -0 rm -f --
Teil und lassen Sie dieZ
Option zu ausgrep
.Ein anderer Benutzer schlug Folgendes vor, das Sie nicht ausführen sollten, da es unsicher ist:
Wenn ich Dateien habe
ImportantStuff
, die ich nicht löschen undobsolete ImportantStuff
enthalten möchtefoo
, dann verliere ichImportantStuff
(und nichtobsolete ImportantStuff
!), Wenn ich diesen Befehl ausführe, weil$files
er bei der Interpretation an Leerzeichen auseinanderbricht. Es ist gefährlich, auf diese Weise eine Liste von Dateinamen in eine skalare Shell-Variable einzufügen.quelle
Dies sucht rekursiv nach Dateien mit
foo
. Die zweite-exec
wird nur ausgeführt, wenn die ersteexec
erfolgreich beendet wurde, dh wenngrep
Übereinstimmungen vorliegen. Dryrun und entferne das,echo
wenn die Ausgabe korrekt erscheint.Oder alternativ
und
wie von Lekensteyn vorgeschlagen.
quelle
find -type f -exec grep -q 'foo' {} \; -delete
(die Anführungszeichen{}
sind überflüssig, könnenfind
auch Dateien löschen.) Beachten Sie, dassgrep
ein regulärer Ausdruck akzeptiert wird. Wenn Sie suchen möchtenfoo.bar
, können Sie entweder diese-F
Option deaktivieren oder das Muster als Literal behandeln.-exec echo rm "{}" \;
und nicht-delete
?-delete
. Es ist nur einfacher, mit der Sekunde-exec
und dem Echo vor Ort zu demonstrieren .-print
(oder-ls
für mehr Ausführlichkeit) als-exec echo rm "{}" \'
. Keine Notwendigkeit für externe Dienstprogramme.Ich würde tun, was Adrian sagt,
Aber ich würde Wortgrenzen hinter dem Foo einfügen, um nicht versehentlich Dateien zu löschen, die "Lebensmittel" enthalten (es sei denn, alles, was Lebensmittel enthält, wird gelöscht, was Sie wollen.)
Eigentlich würde ich die Ausgabe vor dem Löschen umleiten, damit ich sie vor dem Löschen überprüfen kann:
quelle