Question Linux: comment copier un fichier avec un certain modèle de nom pour lequel l'emplacement exact dans la structure de répertoire complexe est inconnu


Je souhaite copier tous les fichiers portant le nom XYZ * dans un seul dossier. Le problème est que les fichiers se trouvent dans des sous-dossiers différents et que même la profondeur de la structure des dossiers n'est pas la même pour tous les fichiers. Heureusement, au moins chaque fichier a un nom unique.

Bien sûr, j'ai pensé à la commande cp mais je suppose que la profondeur de la structure des dossiers doit être la même pour que cela fonctionne.


4
2017-09-19 16:24


origine




Réponses:


Si vous voulez éviter de lancer plusieurs processus séparés (comme utiliser find ... -exec cp ... peut faire) en utilisant bash (et ne pas avoir zsh pour son formulaire **), vous pouvez faire un seul cp comme suit:

cp -p $(find path/to/src -name 'XYZ*') path/to/dest

Le formulaire $ (...) est une version posix de la substitution de processus entre guillemets. Voici un exemple.

find . -name 'd*a'
cp -p $(find . -name 'd*a') ../zeta
ls ../zeta

Ces commandes ont généré la sortie suivante:

./.?/dx2a
./.?/dx4a
./.tdot1/dx1a
./.tdot2/dx2a
cp: will not overwrite just-created `../zeta/dx2a' with `./.tdot2/dx2a'
dx1a  dx2a  dx4a

7
2017-09-19 16:49





Vous pouvez utiliser trouver pour ça:

$ find path/to/src -type f -name XYZ\* -exec cp -p {} path/todest/ \;

2
2017-09-19 16:26





Si vous utilisez zsh au lieu de bash, vous pouvez le faire avec le motif ** glob de fichier. Cela correspond récursivement à tous les sous-dossiers.

cp path/to/src/**/XYZ* path/to/dest

1
2017-09-19 16:31