J'utilise déjà la commande ci-dessous pour copier des fichiers à partir d'une date spécifique.
Auparavant, j'utilisais cette commande et cela fonctionnait bien, mais maintenant, une erreur était affichée:
-bash: /bin/cp: Argument list too long
Recommandé utilisé:
cd /share/new/
cp `find . -type f -newermt '16 july 2018'` /share/test
J'ai besoin de copier tous les fichiers du dossier "nouveau" du 20 juillet à la date d'aujourd'hui. Comment puis-je atteindre cet objectif?
N'utilisez pas cp
directement avec la sortie de find
.
Il se peut qu’il passe beaucoup de fichiers en une seule étape (et c’est pourquoi vous obtenez l’erreur Argument list too long
).
Utilisez le paramètre -exec
de find
, qui exécute la commande donnée en transmettant tous les fichiers correspondants à cp
, l'un après l'autre:
cd /share/new/
find . -type f -newermt '16 july 2018' -exec cp {} /share/test \;
utilisez find -exec
:
find /share/new/ -type f -newermt '16 july 2018' -exec cp {} /share/test \;
Utilisez l'action -exec
de find
et l'option -t
de cp
; Je recommande également les options -i
ou -n
si vous ne voulez pas écraser par accident des fichiers de même nom:
find ... -exec cp -i -t TARGET -- {} +
Les autres réponses en cours génèrent un processus enfant cp
pour chaque fichier correspondant, tandis que cette réponse en génère autant qu'il est nécessaire en fonction de la longueur totale des arguments du programme (voir ci-dessous), ce qui fera toute la différence une fois que vous aurez atteint quelques milliers de correspondances. être votre cas.
À partir du find(1)
:
-exec command ;
- Exécutez la commande […]. Tous les arguments suivants à rechercher sont considérés comme des arguments de la commande jusqu'à ce qu'un argument composé de;
soit rencontré. La chaîne{}
est remplacée par le nom du fichier en cours de traitement, où qu’il se trouve dans les arguments de la commande […]. La commande spécifiée est exécutée une fois pour chaque fichier correspondant. […]
-exec command {} +
- Cette variante de l'action-exec
exécute la commande spécifiée sur les fichiers sélectionnés, mais la ligne de commande est créée en ajoutant chaque nom de fichier sélectionné à la fin. le nombre total d'invocations de la commande sera bien inférieur au nombre de fichiers correspondants. […]
À partir du cp(1)
:
-t
,--target-directory=DIRECTORY
- copie tous les arguments SOURCE dans DIRECTORY-i
,--interactive
- Demande avant écrasement-n
,--no-clobber
- ne pas écraser un fichier existant