Also, bei drei Optionen ...
find .... -delete
find .... | xargs rm ...
find .... -exec rm ...;
..oder Variationen davon, welche Option ist vorzuziehen?
Ich vermute, es gibt keine feste Antwort, und eine bestimmte Situation wird die beste Option bestimmen (bitte nennen Sie sie!).
Prost.
find ... -exec rm ...+
ist ähnlich schnell wie diexargs
Version.Antworten:
Option 1 vermeidet das Laichen externer Prozesse, was unter Stressbedingungen nützlich ist.
Option 2 erzeugt einen einzelnen
xargs
Prozess, der nur so vielerm
Prozesse wie nötig erzeugt. Diese Option wird normalerweise mit-print0
und-0
verwendet, um Dateinamen mit Leerzeichen und / oder Zeilenumbrüchen zu behandeln.Option 3 erzeugt einen
rm
Prozess für jede Datei.GNU find (oder eine POSIX-kompatible Version von find) ermöglicht eine vierte Option,
find .... -exec rm -r {} +
dierm
mit so vielen Dateinamen wie möglich ausgeführt wird, um nur eine begrenzte Anzahl von ihnen zu erzeugen.quelle
Ich bevorzuge es,
find ... > file.txt
die Datei ausgiebig zu überprüfen und dann zu verwenden,find ... -delete
damit ich weiß, dass genau die gleichen Ergebnisse gelöscht werden (das Übergeben von Argumenten ist meistens kugelsicher, meistens).quelle
Das Thema Löschen von Dateien wird im Abschnitt "Aufräumen" in der Dokumentation zu GNU findutils behandelt. Sie können dies auf Ihrem System mit "info find" oder in Emacs lesen. Sie können es auch online unter http://www.gnu.org/software/findutils/manual/html_node/find_html/Cleaning-Up.html#Cleaning-Up anzeigen .
Dies ist die sicherste (gegen symbolische Link-Rennen) und leistungsstärkste (da bei vollem Pipe-Puffer nichts ausgeführt oder ein Kontextwechsel durchgeführt werden muss) Option. Aber denken Sie daran, dass -delete -tiefe impliziert.
Dies ist in Situationen gefährlich, in denen andere Schreibzugriff auf den Baum haben, in dem Sie bereinigen. Angenommen, der Befehl find hat entschieden, dass /var/tmp/scratch/me/.ssh/config den Anforderungen entspricht, und druckt daher diese Namen zu stdout. Der Befehl xargs liest das und fügt es einer Datenstruktur hinzu. Kurze Zeit später (wenn xargs die durch den Standardwert der Option -s angegebene Anzahl von Bytes gelesen hat) wird xargs gegabelt und ausgeführt, um sie zu löschen. Es ist jedoch möglich, dass in der Zwischenzeit jemand anderes dies getan hat:
Wenn rm dann /var/tmp/scratch/me/.ssh/config löscht, wird der Systemaufruf unlink ("/ var / tmp / kratzer / me / .ssh / config") ausgegeben. Da der Kernel die symbolische Verknüpfung für Sie auflöst, entspricht dies dem Aufruf von unlink ("/ root / .ssh / config"). Wenn der xargs-Prozess als root ausgeführt wurde, wird /root/.ssh/config gelöscht, obwohl Sie in der Befehlszeile -L nicht angegeben haben. Wenn Sicherheit wichtig ist, verwenden Sie aus diesem Grund -delete. Weitere Informationen zu diesem Bereich finden Sie im Abschnitt "Sicherheitsaspekte" des GNU-Suchhandbuchs.
Da dies auch Fork / Exec betrifft, gibt es dieselben Sicherheitsprobleme, die ich oben erwähnt habe.
Kurz gesagt, der einzige Grund, -delete nicht zu verwenden, ist die Kompatibilität mit Systemen, die -delete nicht unterstützen.
quelle