it-swarm.com.de

find - exec rm vs -delete

Ich versuche den Unterschied zwischen diesen beiden Befehlen zu verstehen:

Sudo find / -name .DS_Store -delete

und

Sudo find / -name ".DS_Store"  -exec rm {} \;

Mir ist aufgefallen, dass die Methode exec bevorzugt wird. Warum? Welches ist sicherer/schneller/besser? Ich habe beide auf meinem Macbook verwendet und alles scheint gut zu funktionieren.

295
Onion

-delete wird eine bessere Leistung erzielen, da nicht für jede übereinstimmende Datei ein externer Prozess erzeugt werden muss.

Möglicherweise sehen Sie -exec rm {} \; oft empfohlen, weil -delete existiert nicht in allen Versionen von find. Ich kann es momentan nicht überprüfen, aber ich bin mir ziemlich sicher, dass ich ein find ohne es verwendet habe.

Beide Methoden sollten "sicher" sein.

EDIT pro Kommentar von @doitmyway: Stellen Sie sicher, dass Sie mit dem Namen übereinstimmen und dann löschen, nicht umgekehrt (löschen, dann abgleichen). Andernfalls wird jede Datei gelöscht, unabhängig davon, ob sie übereinstimmt oder nicht . Das heißt, NICHT mach das: find / -delete -name .DS_Store.

Eine übliche Methode, um den Aufwand für das Laichen eines externen Prozesses für jede übereinstimmende Datei zu vermeiden, ist:

find / -name .DS_Store -print0 | xargs -0 rm

(Beachten Sie jedoch, dass auch hier ein Portabilitätsproblem vorliegt: Nicht alle Versionen von find haben -print0!)

280
Celada

Angenommen, .DS_Store Stellt Dateien und keine Verzeichnisse dar, wäre der portabelste und dennoch schnellste Weg, dies zu tun:

Sudo find / -name .DS_Store -exec rm {} +

Das einzige Risiko besteht darin, dass Sudo nicht verfügbar ist, aber es ist heutzutage ziemlich gering.

Die Option -delete, Die verwendet wird, um GNU find zu fordern und ist in vielen anderen find-Implementierungen immer noch nicht Standard, ist daher nicht immer verfügbar.

Die Befehlsbeendigung + Anstelle von \; Optimiert die exec -Klausel erheblich, indem der Befehl rm nicht für jeden .DS_Store Ausgeführt wird das Dateisystem.

30
jlliagre

Bei einem Computer wie Ihrem MacBook werden Sie keinen großen Leistungsunterschied zwischen den beiden Befehlen feststellen. Wenn Sie sich jedoch die -exec-Version ansehen, sehen Sie einen subtilen Unterschied:

Sudo find / -iname ".file-to-delete"  -exec rm {} \;

Dies bedeutet, dass Sie alle Dateien mit dem Namen ".file-to-delete" finden. Diese Suche kann jedoch einige unerwünschte Fehlalarme zurückgeben. Wenn Sie etwas mit Sudo machen, sollten Sie etwas vorsichtiger sein. Der Vorteil der Verwendung von -exec rm {} besteht darin, dass Sie Argumente wie folgt an rm übergeben können:

Sudo find / -iname "*~"  -exec rm -i {} \;

In diesem Beispiel möchte ich die von emacs erstellten Sicherungsdateien entfernen. Diese Tilde könnte sich jedoch in einer obskuren Datei befinden, von der ich nichts weiß und die wichtig sein könnte. Außerdem möchte ich das Löschen bestätigen. Also habe ich die Option '-i' in den Befehl rm eingefügt. Dies gibt mir ein interaktives Löschen.

Sie können auch die Verwendung von rm zum Löschen von Verzeichnissen und Dateien verfeinern:

find /usr/local/share/ -iname "useless" -exec rm -r {} \;

Kurz gesagt, mit -exec haben Sie etwas mehr Kontrolle über den eigentlichen Befehl, mit dem das gefundene Element entfernt wird. Der Vorteil ist, dass Sie ein Tool verwenden, um die Dateien zu finden, ein anderes Tool, um sie zu entfernen. Außerdem verfügt nicht jede Version des Dienstprogramms find über die Option -delete. Verwenden Sie also besser jedes Werkzeug für die richtige Arbeit. Dies ist die Unix-Philosophie - ein Tool, ein Job, verwenden Sie sie zusammen, um das zu tun, was Sie tun müssen.

17