Si je voulais copier tous les *.so
fichiers de src
vers dst
je ferais:
cp src/*.so dst
Cependant, je veux copier tous les *.so
fichiers de src et il subdirs de dans dst
. Des indices?
Essayer:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
find
peut 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/ ';'
grep
modèles l'emportent de loin sur les modèles de shell simples utilisés dans le-name
paramètrefind
.xargs
est également beaucoup plus puissant que le-exec
paramètrefind
.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: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éfinissezdotglob
également l' option (par exemple, avecshopt -s dotglob
). Vous pouvez les définir tous les deux dans une seule commande:la source
J'ai essayé la commande suggérée par Mike:
mais cela a fini par vider tous les fichiers dans le répertoire
dst
avec leurs chemins d'accès relatifs perdus.Pour conserver les chemins relatifs, la commande doit être modifiée comme suit:
la source
dst
. Dans le cas contraire, utilisezcp --parents
. Assurez-vous également de citer les noms de fichiers. Ainsi:... | xargs -i cp --parents "{}" dst
(notez que le dernier argument decp
est désormais "juste" le répertoire de destination). La commande peut être encore plus court (et probablement plus rapide) en utilisant le-t
drapeau:... | xargs cp --parents -t dst
.... | xargs cp {} --parents -t dst.
--parents
n'est pas disponible. J'ai utiliséditto
à sa place: stackoverflow.com/questions/11246070/cp-parents-option-on-macUne autre façon de procéder est la suivante:
la source
cp
processus:... -exec cp -t dst/ {} +
.-exec
par;
,{}
est remplacé par un chemin à la fois. Vous obtenez uncp
fichier séparé pour chaque fichier. Avec la+
syntaxefind
remplace{}
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+
, donccp -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 :
la source