Was ist das fehlende Argument für -exec?

Was ist das fehlende Argument für -exec?

Ich verwende den folgenden Befehl, um ein Verzeichnis von Dateien und Verzeichnissen zu löschen, die älter als 30 Tage sind, und verschiebe sie in ein Archivverzeichnis, das ich nach ein paar Wochen löschen kann, wenn niemand seine Dateien zurückfordert. Das Zielverzeichnis hat Unterverzeichnisse nach Benutzernamen, ebenso wie das Archivverzeichnis.

Dies ist der Befehl, den ich verwende:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

Ich habe eine geänderte Version davon vorgeschlagen, um eine Frage auf Ask Ubuntu zu beantworten. Ein anderer Benutzer hat den Code bearbeitet, um das Zeilenende zu ändern \;, +da dies schneller (und korrekter?) ist.Siehe hier

Allerdings +funktioniert die Verwendung auf diese Weise, wenn der -execBefehl vorhanden ist ls -lh, aber nicht im eigentlichen Befehl, den ich verwende. Wenn ich es mit versuche, +erhalte ich eine Fehlermeldung:

find: missing argument to '-exec'

Ich verstehe nicht, warum es sich so verhält oder was der richtige Befehl wäre. Bitte posten Sie nicht einfach eine Befehlskorrektur, ich möchte es lieber verstehen, als einfach blind einem Vorschlag zu folgen.

Antwort1

Der Benutzer in diesem Beitrag hat möglicherweise gesagt, dass das +Zeichen am Ende eines -execBefehls schneller ist, aber nicht warum.

Nehmen wir an, der findBefehl gibt die folgenden Dateien zurück:

/path/to/file1
/path/to/file2
/path/to/file3

Der normale -execBefehl ( -exec command {} \;) wird einmal für jede passende Datei ausgeführt. Beispiel:

find ... -exec mv {} /target/ \;

Führt aus:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

+Wenn Sie das Zeichen ( ) verwenden -exec command {} +, wird der Befehl erstellt, indem am Ende des Befehls mehrere übereinstimmende Dateien hinzugefügt werden. Beispiel:

find ... -exec mv -t /target/ {} +

Führt aus:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

Um das Flag richtig zu verwenden +, muss das zu verarbeitende Argument am Ende des Befehls stehen, nicht in der Mitte. Deshalb findtrows missing argument to '-exec'in Ihrem Beispiel; es fehlt das schließende {}.

Antwort2

Der Benutzer hat seine Bearbeitung erklärt …

Der Terminator von „+“ exec ist schneller als „\;“, siehe https://askubuntu.com/questions/558817/what-is-the-difference-between-using-and-in-exec-command; und das Erstellen einer Sicherungsdatei aus der Originaldatei ist eine gute Idee

...mithilfedieser Link. Ich denke, im Grunde werden nicht mehrere Befehle verwendet, sondern alle Dateinamen werden an eine Befehlsinstanz gesendet, um die Dinge zu beschleunigen. Hier ist ein Beispiel vonHier:

Die Verwendung von -exec mit einem Semikolon ( find . -exec ls '{}' \;) führt aus

ls file1
ls file2
ls file3

Wenn Sie stattdessen jedoch ein Pluszeichen ( find . -exec ls '{}' \+) verwenden, werden alle Dateinamen als Argumente an einen einzigen Befehl übergeben:

ls file1 file2 file3

Es sind auch andere Formulare mit ;und verfügbar (von+Hier:)

Daher ist die folgende Beispielsyntax für den Find-Befehl zulässig:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

JEDOCH bin ich mir nicht sicher, ob dies überhaupt mit dem Move-Befehl funktioniert, da dessen Syntax lautet mv [OPTION]... SOURCE DEST, es sei denn, die -tOption oder ähnliches wird verwendet. Es sollte jedoch mit lsohne zusätzliche Optionen usw. funktionieren, da sie verstehen, wenn mehrere Dateinamen angegeben werden. Möglicherweise +muss auch maskiert werden (d. h. \+).

verwandte Informationen