69 votes

Copie récursive d'un type de fichier spécifique maintenant la structure du fichier dans Unix/Linux ?

J'ai besoin de copier tout *.jar des fichiers d'un répertoire en conservant la structure des dossiers des répertoires parents. Comment puis-je le faire dans un terminal UNIX/Linux ?
La commande cp -r *.jar /destination_dir n'est pas ce que je recherche.

0 votes

Le répertoire de destination doit-il conserver la structure de dossiers du répertoire source ?

113voto

Sean Points 3056

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

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

La structure de répertoire complète de . est copiée dans /destination_dir, mais seuls les fichiers .jar sont copiés. L'option -a garantit que toutes les permissions et les heures sur les fichiers sont inchangées. L'option -m permet d'omettre les répertoires vides. -v est pour une sortie verbeuse.

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

4 votes

Pourriez-vous m'expliquer cette partie : -f 'hide,! */' ? Merci d'avance pour votre aide !

10 votes

Bien sûr. Le -f signifie que c'est une règle de filtrage (abréviation de --filter). La règle dit de cacher tous les non-répertoires, c'est-à-dire les fichiers. Le motif '*/' correspond à un répertoire, puis le ! l'annule pour signifier tout ce qui n'est pas un répertoire (donc, un fichier). Le paramètre '--include=*.jar' est prioritaire sur le filtre, donc les fichiers .jar (uniquement) sont inclus.

0 votes

Juste pour être sûr d'avoir compris, vous filtrez la commande en disant qu'elle doit correspondre à tout ce qui n'est pas un répertoire, ce qui signifie tous les fichiers. Et la commande --include s'assure que seuls .m sont pris en compte. Une dernière question, que se passe-t-il si je souhaite copier seulement les fichiers de ce répertoire, sans copier toute la structure du répertoire ?

40voto

uzsolt Points 1303

Si vous n'avez pas besoin de la structure du répertoire mais seulement des fichiers jar, vous pouvez utiliser :

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

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

2 votes

+1 pour shopt globstar, je ne connaissais pas ces deux choses, utile.

4 votes

Merci d'avoir signalé le --parents option. Elle fait quelque chose de légèrement différent de l'exigence des affiches : Elle crée la structure de répertoire aussi loin que nécessaire pour que les fichiers soient copiés et non la structure entière du répertoire. - C'était exactement ce que I nécessaire ! :-)

2 votes

cp -rf --parents destination_dir fonctionne parfaitement

20voto

user unknown Points 15555

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

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

Si votre recherche ne fournit pas le "+" pour l'invocation parallèle, vous pouvez utiliser " ;", mais vous pouvez alors omettre le "+". -t :

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

1 votes

Si l'utilisateur n'utilise pas GNU find, il y aura -exec mais pas avec le + terminateur de commande.

0 votes

Merci, @glennjackman. J'ai ajouté une solution plusless.

0 votes

@glennjackman -1. Le terminateur de commande + est défini par POSIX. pubs.opengroup.org/onlinepubs/009604599/utilités/trouver.html

8voto

Bartosz Moczulski Points 972
cp --parents `find -name \*.jar` destination/

de man cp :

--parents
       use full source file name under DIRECTORY

0 votes

L'OP a marqué "unix", pas Linux. A ma connaissance, l'option --parents de cp est réservée à Linux.

4voto

Pavan Manjunath Points 10853
tar -cf - `find . -name "*.jar" -print` | ( cd /destination_dir && tar xBf - )

0 votes

Pourquoi utilisez-vous le drapeau B pour le goudron de destination ? La page de manuel dit seulement "rebloquer comme nous lisons". Je n'ai jamais rencontré de problèmes évidents sans cela dans des configurations similaires, mais je suis curieux.

0 votes

@EduardoIvanec Reblock s'assurera que la copie s'est déroulée correctement. linuxdevcenter.com/pub/a/linux/lpt/18_16.html . Aussi, à partir des docs GNU sur le goudron, If --read-full-records (-B) is used, tar will not panic if an attempt to read a record from the archive does not return a full record. Instead, tar will keep reading until it has obtained a full record Mais comme vous l'avez observé, il devrait fonctionner correctement dans la plupart des cas.

0 votes

J'ai eu un problème avec le premier tar qui a quitté prématurément à cause du signal 13 (broken pipe) avec cette méthode. Seuls certains des fichiers ont été copiés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X