GNU/Linux >> LINUX-Kenntnisse >  >> Linux

finden:-exec rm {} \; vs. -delete - warum wird ersteres allgemein empfohlen?

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

Linux
  1. finde -exec eine Shell-Funktion in Linux?

  2. Wie finde ich die maximale Stapelgröße?

  3. Wo ist die Header-Datei <conio.h> unter Linux? Warum kann ich <conio.h> nicht finden?

  4. Warum ist das .bss-Segment erforderlich?

  5. Erläuterung des Befehls „find -mtime“.

Eine benutzerfreundliche Alternative zum Find-Tool in Linux

Suchen -exec + Vs Finden | Xargs:Welche soll man wählen?

Die Option -exec in Find zum Laufen bringen?

Der Linux-Befehl zum Suchen des Verzeichnisses:Erklärt

Wie man die Ergebnisse von 'find' unter Linux an mv weiterleitet

Was ist die korrekte find -exec-Syntax