Mit dem folgenden Befehl lösche ich ein Verzeichnis von Dateien und Verzeichnissen, die älter als 30 Tage sind, und verschiebe sie in ein Archivverzeichnis, das ich nach einigen Wochen löschen kann, wenn niemand nach ihren Dateien fragt. Das Zielverzeichnis hat Unterverzeichnisse nach Benutzernamen, ebenso das Archivverzeichnis.
Dies ist der Befehl, den ich benutze:
find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;
Ich schlug vor , eine leicht modifizierte Version dieses eine Frage zu beantworten auf fragen ubuntu, bearbeiten ein anderer Benutzer den Code , um das Ende der Zeile zu ändern , \;
für +
wie es ist schneller (und richtig?). Siehe hier
Die Verwendung +
auf diese Weise funktioniert jedoch, wenn der -exec
Befehl ls -lh
nicht in dem tatsächlichen Befehl enthalten ist, den ich verwende. Wenn ich es mit probiere +
bekomme 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 nur eine Befehlskorrektur, ich würde gerne verstehen, anstatt nur blind einem Vorschlag zu folgen.
quelle
+
mehrere Argumente für den gleichen Befehl liefert, aber ich komme damit nicht klarmv
!Antworten:
Der Benutzer in diesem Beitrag kann sagen, 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:Der normale
-exec
Befehl (-exec command {} \;
) wird für jede übereinstimmende Datei einmal ausgeführt. Beispielsweise:Führt aus:
Wenn Sie
+
sign (-exec command {} +
) verwenden, wird der Befehl erstellt, indem am Ende des Befehls mehrere übereinstimmende Dateien hinzugefügt werden. Beispielsweise:Führt aus:
Um das
+
Flag korrekt zu verwenden, muss sich das zu verarbeitende Argument am Ende des Befehls und nicht in der Mitte befinden. Das ist der Grund, warumfind
Trowsmissing argument to '-exec'
in Ihrem Beispiel sind. es verfehlt den Abschluss{}
.quelle
find -exec
erforderlich ist{}
, das letzte Argument zu sein, wenn es mit verwendet wird+
. Weiß jemand, warum diese Entwurfsentscheidung getroffen wurde, anstatt Konstrukte wie die Befehlszeile des OP funktionieren zu lassen?Der User erklärte ihre Bearbeitung ....
... über diesen Link . Ich denke, anstatt mehrere Befehle zu verwenden, werden alle Dateinamen an eine Befehlsinstanz gesendet, um die Dinge zu beschleunigen. Hier ist ein Beispiel von hier :
Es gibt auch andere Formulare mit
;
und+
(von hier aus :)Daher ist die folgende Beispielsyntax für den Befehl find zulässig:
Ich bin mir jedoch nicht sicher, ob dies mit dem Befehl move funktioniert, da es sich um eine Syntax handelt
mv [OPTION]... SOURCE DEST
, sofern nicht die-t
Option oder eine ähnliche Option verwendet wird. Es sollte jedochls
ohne zusätzliche Optionen usw. funktionieren, da sie verstehen können, wenn mehrere Dateinamen angegeben werden. Die müssen+
möglicherweise auch entkommen (dh\+
)quelle
mv -t
beiden +1 erkläre !