tl;dr:-delete
wird von POSIX nicht benötigt, -exec
ist.
Fakten
POSIX 1003.1 Manpage für find
gibt -exec
an aber nicht -delete
.
Das bedeutet -exec
sollte praktisch überall funktionieren. Ich wäre überrascht, find
zu finden das hat -delete
ohne -exec
. Das Gegenteil ist durchaus möglich. Besonders leichte Systeme, die busybox
verwenden neigen dazu, nur grundlegende Befehlszeilenoptionen bereitzustellen.
Z.B. Ich habe ein OpenWRT auf einem meiner Router und dessen find
versteht -exec
, versteht es -delete
nicht .
Kein -delete
ist keine große Sache, wenn Sie -exec rm …
haben . Andererseits -delete
kann -exec
nicht ersetzen Im Algemeinen. Es ist ein kluges Design, -delete
wegzulassen zuerst.
Persönliche Erfahrungen, Beobachtungen und Meinungen
Das obige sollte der Hauptgrund für -exec rm {} \;
sein ist so weit zu empfehlen. Die Sekundärseite kann ein Schneeballeffekt sein. Benutzer lesen Artikel und Beispiele, machen sich mit -exec
vertraut und ihre eigenen Befehle veröffentlichen (z. B. hier auf Super User). Einige von ihnen kennen vielleicht nicht einmal -delete
existiert.
Wenige Male habe ich Bemerkungen gesehen (oder gegeben) wie 'Sie können -delete
verwenden stattdessen'. Und die Antworten waren wie „Danke, das wusste ich nicht“. Ich erinnere mich an keine Antwort 'Ich weiß, aber das ist nicht POSIX'.
Nachdem ich das alles gesagt habe, neige ich dazu, -delete
zu erwähnen immer -exec rm {} \;
erscheint. Der Grund ist -delete
erzeugt keinen neuen Prozess, während -exec rm {} \;
ruft einen separaten rm
auf für jede übereinstimmende Datei. Wenn Sie -delete
nicht verwenden können dann sollte Ihr nächster Gedanke -exec rm {} +
sein der mehrere Dateien mit einem einzigen rm
entfernen kann (Trotzdem wird rm
aufgerufen bei Bedarf mehr als einmal).
Warum ist -exec … +
nicht dann sehr zu empfehlen? Es könnte an seinen Einschränkungen liegen. Ich kann mir vorstellen, dass ein unerfahrener Benutzer denkt:„Das funktioniert mit rm
, lass es mich mit mv
verwenden !' Dann -exec mv {} foo/ +
funktioniert nicht, weil {}
muss am Ende stehen, kurz vor +
. Der Benutzer ist frustriert und rennt zurück zu mama Fenster.
Wir empfehlen -delete
ist normalerweise sicher hier auf Super User, denke ich. Die meisten Fragen spezifizieren "große" Betriebssysteme, find
Befehle gibt es reich an Optionen. Und selbst wenn es einen Benutzer gibt, dessen find
ist begrenzt Ich werde wahrscheinlich Feedback bekommen. Er oder sie sagt, dass die Lösung für sie nicht funktioniert, und ich schlage -exec rm …
vor Erklären Sie stattdessen das Problem usw.
Ein eigenständiger Artikel, der -delete
empfiehlt bekommt kein solches Feedback. Im Falle eines Problems geht ein Benutzer einfach zum nächsten von Google zurückgegebenen Link.
Der Unterschied liegt in der Flexibilität. Wenn Sie -exec verwenden, führen Sie für jede ausgewählte Datei einen Befehl aus. Wenn Sie -exec verwenden, haben Sie die Flexibilität, andere Suchoptionen anzuwenden. Mit -delete wird die Verwendung von -prune eingeschränkt. Darüber hinaus wirkt sich Ihre Platzierung von -delete auf Ihre Ergebnisse aus. Siehe Dokumentationsausschnitt unten:
-delete
Delete files; true if removal succeeded. If the removal failed,
an error message is issued. If -delete fails, find’s exit status will be
nonzero (when it eventually exits). Use of -delete automatically turns on
the ‘-depth’ option.
Warnings: Don’t forget that the find command line is evaluated as an
expression, so putting -delete first will make find try to delete every-
thing below the starting points you specified. When testing a find
command line that you later intend to use with -delete, you should
explicitly specify -depth in order to avoid later surprises.
Because -delete implies -depth, you cannot usefully use -prune and -delete
together.
-exec command ;
Execute command; true if 0 status is returned. All following arguments
to find are taken to be arguments to the command until an argument
consisting of ‘;’ is encountered. The string ‘{}’ is replaced by the
current file name being processed everywhere it occurs in the arguments
to the command, not just in arguments where it is alone, as in
some versions of find. Both of these constructions might need to be escaped
(with a ‘\’) or quoted to protect them from expansion by the shell.
See the EXAMPLES section for examples of the use of the -exec option.
The specified command is run once for each matched file. The
command is executed in the starting directory. There are unavoidable security
problems surrounding use of the -exec action; you should use the -execdir
option instead.
-exec command {} +
This variant of the -exec action runs the specified command on the
selected files, but the command line is built by appending each selected
file name at the end; the total number of invocations of the command
will be much less than the number of matched files. The command line is
built in much the same way that xargs builds its command lines.
Only one instance of ‘{}’ is allowed within the command. The command is
executed in the starting directory