web-dev-qa-db-fra.com

Copie récursive de fichiers spécifiques sous Unix / Linux?

J'ai besoin de copier tout *.jar fichiers du répertoire et de tous ses sous-répertoires. Comment puis-je le faire dans un terminal UNIX/Linux? Commande cp -r *.jar /destination_dir ne fonctionne pas.

59
Yury Pogrebnyak

rsync est utile pour la copie de fichiers locaux ainsi qu'entre ordinateurs. Cela fera ce que vous voulez:

rsync -avm --include='*.jar' -f 'hide,! */' . /destination_dir

Toute la structure de répertoire de. est copié dans/destination_dir, mais seuls les fichiers .jar sont copiés. Le -a garantit que toutes les autorisations et les heures sur les fichiers ne sont pas modifiées. Le -m omettra les répertoires vides. -v est pour une sortie commentée.

Pour un essai, ajoutez un -n, il vous dira ce qu'il ferait mais ne copiera rien.

90
Sean

Si vous n'avez pas besoin de la structure de répertoires uniquement des fichiers jar, vous pouvez utiliser:

shopt -s globstar
cp **/*.jar destination_dir

Si vous voulez la structure de répertoires, vous pouvez vérifier cp's --parents option.

34
uzsolt

Si votre recherche a un commutateur -exec et cp une option -t:

find . -name "*.jar" -exec cp -t /destination_dir {} +

Si vous ne trouvez pas le "+" pour l'appel parallèle, vous pouvez utiliser ";" mais alors vous pouvez omettre le -t:

find . -name "*.jar" -exec cp {} /destination_dir ";"
17
user unknown
tar -cf - `find . -name "*.jar" -print` | ( cd /destination_dir && tar xBf - )
4
Pavan Manjunath
cp --parents `find -name \*.jar` destination/

de man cp:

--parents
       use full source file name under DIRECTORY
4

Si vous souhaitez conserver la même hiérarchie de répertoires sous la destination, vous pouvez utiliser

(cd SOURCE && find . -type f -name \*.jar -exec tar cf - {} +) \
  | (cd DESTINATION && tar xf -)

Cette façon de procéder, au lieu d’étendre la sortie de find dans les symboles inverses, présente l’avantage de pouvoir traiter n’importe quel nombre de fichiers.

2
Idelic
find . -name \*.jar | xargs cp -t /destination_dir

En supposant que vos noms de fichiers jar ne contiennent pas d'espaces et que votre cp dispose de l'option "-t". Si cp ne peut pas faire "-t"

find . -name \*.jar | xargs -I FILE cp FILE /destination_dir
1
glenn jackman