Si je voulais copier tous les *.sofichiers de srcvers dstje ferais:
cp src/*.so dst
Cependant, je veux copier tous les *.sofichiers de src et il subdirs de dans dst. Des indices?
Si je voulais copier tous les *.sofichiers de srcvers dstje ferais:
cp src/*.so dst
Cependant, je veux copier tous les *.sofichiers de src et il subdirs de dans dst. Des indices?
Réponses:
Essayer:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grepmodèles l'emportent de loin sur les modèles de shell simples utilisés dans le -nameparamètre find. xargsest également beaucoup plus puissant que le -execparamètre find.
Si vous utilisez Bash, vous pouvez activer l' globstar option shell pour faire correspondre les fichiers et les répertoires de manière récursive:
shopt -s globstar
cp src/**/*.so dst
Si vous devez rechercher des fichiers dont les noms commencent par ., et / ou des fichiers dans et sous les répertoires dont les noms commencent par ., définissez dotglobégalement l' option (par exemple, avec shopt -s dotglob). Vous pouvez les définir tous les deux dans une seule commande:
shopt -s globstar dotglob
J'ai essayé la commande suggérée par Mike:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
mais cela a fini par vider tous les fichiers dans le répertoire dstavec leurs chemins d'accès relatifs perdus.
Pour conserver les chemins relatifs, la commande doit être modifiée comme suit:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst. Dans le cas contraire, utilisez cp --parents. Assurez-vous également de citer les noms de fichiers. Ainsi: ... | xargs -i cp --parents "{}" dst(notez que le dernier argument de cpest désormais "juste" le répertoire de destination). La commande peut être encore plus court (et probablement plus rapide) en utilisant le -tdrapeau: ... | xargs cp --parents -t dst.
... | xargs cp {} --parents -t dst.
--parentsn'est pas disponible. J'ai utilisé dittoà sa place: stackoverflow.com/questions/11246070/cp-parents-option-on-mac
Une autre façon de procéder est la suivante:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cpprocessus: ... -exec cp -t dst/ {} +.
-execpar ;, {}est remplacé par un chemin à la fois. Vous obtenez un cpfichier séparé pour chaque fichier. Avec la +syntaxe findremplace {}avec plusieurs résultats (jusqu'à une limite définie par le système de la longueur de la ligne de commande; restriction: {}doit être la dernière chose avant +, donc cp -t). Créer et terminer un processus est une chose relativement coûteuse. Pour cette raison, il est bon de l'utiliser +chaque fois que vous attendez beaucoup de résultats. Dans ce cas, la copie de nombreux fichiers peut prendre beaucoup de temps, de sorte que la différence peut passer inaperçue; néanmoins c'est une bonne pratique.
Le grep peut être remplacé en utilisant le nom de find :
find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
findpeut faire une correspondance de modèle et exécuter des commandes. Il n'est pas nécessaire defind src/ -type f -name '*.so' -exec cp '{}' dst/ ';'