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?
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?
Réponses:
Essayer:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grep
modèles l'emportent de loin sur les modèles de shell simples utilisés dans le -name
paramètre find
. xargs
est également beaucoup plus puissant que le -exec
paramè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 dst
avec 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 cp
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-mac
Une autre façon de procéder est la suivante:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cp
processus: ... -exec cp -t dst/ {} +
.
-exec
par ;
, {}
est remplacé par un chemin à la fois. Vous obtenez un cp
fichier séparé pour chaque fichier. Avec la +
syntaxe find
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 +
, 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/{}
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/ ';'