Ich versuche, den Unterschied zwischen diesen zu verstehen zwei Befehle:
sudo find / -name .DS_Store -delete
und
sudo find / -name ".DS_Store" -exec rm {} \;
Ich habe festgestellt, dass die -exec ... {}
Methode wird bevorzugt. Warum? Welche ist sicherer / schneller / besser? Ich habe beide auf meinem Macbook verwendet und alles scheint gut zu funktionieren.
Antwort
-delete
bietet eine bessere Leistung, da nicht für jeden ein externer Prozess erzeugt werden muss und jede übereinstimmende Datei.
Möglicherweise wird -exec rm {} \;
häufig empfohlen, da -delete
in nicht vorhanden ist Alle Versionen von find
. Ich kann es momentan nicht überprüfen, aber ich bin mir ziemlich sicher, dass ich ein find
ohne es verwendet habe.
B. Andere Methoden sollten „sicher“ sein.
BEARBEITEN pro Kommentar von @doitmyway: Stellen Sie sicher, dass Sie übereinstimmen auf den Namen und dann löschen, nicht umgekehrt (löschen, dann übereinstimmen). Andernfalls wird jede Datei gelöscht, unabhängig davon, ob sie übereinstimmt oder nicht . Dh tun Sie dies nicht: find / -delete -name .DS_Store
.
Eine gängige 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
!)
Kommentare
- Ich sehe. Ich ' habe auch gelesen, dass mit dem Schalter
-delete
, bevor-name
den angegebenen Dateibaum löscht Ich muss also vorsichtig sein. - Bei
find
können Sie-exec rm {} +
verwenden, um alle übereinstimmenden Elemente zu entfernen Dateien mit einem einzelnen Befehlrm
. -
.DS_Store
' t enthalten überhaupt Sonderzeichen, daher sind die Anführungszeichen unnötig und ändern in diesem Fall nichts. - Grundsätzlich ist nur Leerzeichen (Leerzeichen, Tabulatoren, möglicherweise andere) das einzige, was dazu führt, dass eine nicht zitierte Zeichenfolge als interpretiert wird Zwei separate Befehlszeilenargumente, aber das ' ist nicht alles, worüber Sie sich entschuldigen müssen, wenn Sie entscheiden, ob Sie zitieren möchten oder nicht. Sie müssen sich um alle Shell-Metazeichen wie
;
oder|
oder>
oder<
und „ und viele andere, die für die Shell eine besondere Bedeutung haben, sofern nicht anders angegeben. - @MarcoMarsala
xargs
behandelt das Problem der Argumentliste mit begrenzter Größe transparent, indem es in mehrere Aufrufe des Befehls aufgeteilt wird.
Antwort
Unter der Annahme, dass .DS_Store
Dateien und keine Verzeichnisse darstellt, 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 heutzutage recht gering ist.
Die -delete
Option, die zum Anfordern der GNU-Suche verwendet wird und in vielen anderen find
-Implementierungen immer noch nicht Standard ist, daher nicht immer verfügbar ist.
Die Befehlsbeendigung +
in Anstelle von \;
wird die exec
-Klausel stark optimiert, indem der Befehl rm
nicht für jedes und ausgeführt wird jede .DS_Store
, die im Dateisystem vorhanden ist.
Antwort
Für eine Maschine wie z Als 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“ finden -löschen“. 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 rm folgende Argumente übergeben können:
sudo find / -iname "*~" -exec rm -i {} \;
In diesem Beispiel möchte ich die Sicherungsdateien entfernen, die emacs macht. Diese Tilde könnte sich jedoch in einer undurchsichtigen Datei befinden, von der ich nichts weiß und die wichtig sein könnte. Außerdem möchte ich das Löschen bestätigen. Deshalb habe ich die Option „-i“ in den Befehl rm eingefügt. Dadurch erhalte ich 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, die -exec gibt an Sie haben etwas mehr Kontrolle über den eigentlichen Befehl, mit dem das gefundene Element entfernt wird. Der Vorteil besteht darin, dass Sie ein Tool zum Suchen der Dateien und ein anderes Tool zum Entfernen der Dateien verwenden.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.
Kommentare
- Siehe auch
-ok rm {} \;
anstelle von-exec rm {} \;
zur interaktiven Bestätigung.