web-dev-qa-db-fra.com

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

4
Venki

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 \;
9
Mr Shunz

utilisez find -exec:

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

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
0
David Foerster