Copier des fichiers d’un dossier à un autre dans une plage de dates spécifique

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 objective?

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 la Argument list too long erreur est Argument list too long ).

Utilisez le paramètre -exec de find , qui exécute la commande donnée en transmettant cp tous les fichiers correspondants à cp , un à la fois:

 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 souhaitez pas écraser accidentellement des fichiers portant le même nom:

 find ... -exec cp -i -t TARGET -- {} + 

Les autres réponses actuelles génèrent un processus enfant cp pour chaque fichier correspondant alors que cette réponse n’en génère que le nombre nécessaire en fonction de la limite de 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 manuel find(1) :

  • -exec command ; – Exécuter la commande […]. Tous les arguments suivants à rechercher sont considérés comme des arguments de la commande jusqu’à ce qu’un argument soit constitué de ; est rencontré. La chaîne {} est remplacée par le nom du fichier en cours de traitement, où qu’elle 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 manuel cp(1) :

  • -t , --target-directory=DIRECTORY – copie tous les arguments SOURCE dans REPERTOIRE
  • -i , --interactive – invite avant d’écraser
  • -n , --no-clobber – ne pas écraser un fichier existant

Vous devriez essayer cette syntaxe:

 find /share/new/ -type f -newermt '16 july 2018' -exec cp -R /share/test/ {} \;