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 -exec
Befehl 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 -exec
Befehls schneller ist, aber nicht warum.
Nehmen wir an, der find
Befehl gibt die folgenden Dateien zurück:
/path/to/file1
/path/to/file2
/path/to/file3
Der normale -exec
Befehl ( -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 find
trows missing argument to '-exec'
in Ihrem Beispiel; es fehlt das schließende {}
.
Antwort2
Der Benutzer hat seine Bearbeitung erklärt …
...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 ausls 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 -t
Option oder ähnliches wird verwendet. Es sollte jedoch mit ls
ohne zusätzliche Optionen usw. funktionieren, da sie verstehen, wenn mehrere Dateinamen angegeben werden. Möglicherweise +
muss auch maskiert werden (d. h. \+
).