J'utilise la commande suivante pour effacer un répertoire, des fichiers et des répertoires de plus de 30 jours, et les déplacer vers un répertoire d'archives que je peux supprimer après quelques semaines si personne ne demande à récupérer leurs fichiers. Le répertoire cible a des sous-répertoires par nom d'utilisateur, tout comme le répertoire d'archivage.
Voici la commande que j'utilise:
find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;
J'ai proposé une version modifiée de ce pour répondre à une question demander ubuntu, un autre utilisateur a modifié le code pour changer la fin de la ligne \;
pour +
qu'il est plus rapide (et plus juste?). Vois ici
Cependant, l'utilisation +
de cette manière fonctionne si la -exec
commande est ls -lh
mais pas dans la commande réelle que j'utilise. Si je l'essaye avec, +
j'obtiens un message d'erreur:
find: missing argument to '-exec'
Je ne comprends pas pourquoi il se comporte de cette façon, ni quelle serait la commande correcte. S'il vous plaît ne postez pas seulement une correction de commande, j'aimerais comprendre plutôt que de simplement suivre une suggestion aveuglément.
la source
+
fournit plusieurs arguments à la même commande, mais jemv
ne peux pas y faire face!Réponses:
L'utilisateur de ce message peut dire que le
+
signe à la fin d'une-exec
commande est plus rapide, mais pas pourquoi.Supposons que la
find
commande retourne les fichiers suivants:La
-exec
commande normale (-exec command {} \;
) s'exécute une fois pour chaque fichier correspondant. Par exemple:Exécute:
Si vous utilisez le
+
signe (-exec command {} +
), la commande est créée en ajoutant plusieurs fichiers correspondants à la fin de la commande. Par exemple:Exécute:
Pour utiliser
+
correctement l' indicateur, l'argument à traiter doit être à la fin de la commande, pas au milieu. C'est pourquoifind
Trowsmissing argument to '-exec'
dans votre exemple; il manque la fermeture{}
.la source
find -exec
requiert que ce{}
soit le dernier argument, lorsqu'il est utilisé avec+
. Quelqu'un sait pourquoi cette décision de conception a été prise, au lieu de laisser fonctionner des constructions comme la ligne de commande de l'OP?L'utilisateur a expliqué sa modification ....
... en utilisant ce lien . Je pense qu'au fond, au lieu d'utiliser plusieurs commandes, il envoie tous les noms de fichiers à une seule instance de commande, pour accélérer les choses. Voici un exemple d' ici :
Il existe d'autres formulaires disponibles en utilisant
;
et+
aussi (à partir d' ici :)Par conséquent, l'exemple de syntaxe suivant est autorisé pour la commande find:
CEPENDANT, je ne suis pas sûr que cela fonctionnera de toute façon avec la commande move, comme c'est la syntaxe
mv [OPTION]... SOURCE DEST
, à moins que l'-t
option ou similaire ne soit utilisée. Cependant, cela devrait fonctionnerls
sans options supplémentaires, etc. car ils peuvent comprendre quand plusieurs noms de fichiers sont donnés. Il+
peut également être nécessaire d’échapper (c.-à-d.\+
)la source
mv -t
deux + 1!