Comment puis-je copier de manière récursive les fichiers par extension de fichier, en préservant la structure du répertoire?

À la ligne de commande Linux, j'aimerais copier un ensemble (très important) de fichiers .txt d'un répertoire (et de ses sous-répertoires) vers un autre.

J'ai besoin de la structure du répertoire pour rester intact, et je dois ignorer les fichiers sauf ceux qui se terminent par .txt .

Vous pouvez utiliser find and cpio pour le faire

 cd /top/level/to/copy find . -name '*.txt' | cpio -pdm /path/to/destdir (-updm for overwrite destination content.) 
 cd /source/path find -type f -name \*.txt -exec install -D {} /dest/path/{} \; 

Qu'en est-il de vous d'abord le copier avec

 cp -r /old/folder /new/folder 

Puis accédez au nouveau dossier et exécutez

 find . -type f ! -iname "*.txt" -delete 

ou juste

 cp -r /old/folder /new/folder && find . -type f ! -iname "*.txt" -delete 

Edit: ok, vous voulez une commande qui filtre (je n'ai pas testé ceci car mon système n'a pas la commande cpio !). Voici où je l'ai trouvé: http://www.gnu.org/software/findutils/manual/html_mono/find.html#Copying-A-Subset-of-Files

 find . -name "*.txt" | cpio -pmd0 /dest-dir 

Testez ceci d'abord, car je ne l'ai pas encore essayé. Si quelqu'un vérifie, ce serait génial.

La manière la plus simple qui a fonctionné pour moi:

 cp --parents -R jobs/**/*.xml ./backup/ 

Une prise est que vous devez naviguer vers le répertoire "souhaité" avant afin que le "chemin parent" soit correct.

Veillez également à ce que vous ayez activé les points de vue récursifs dans bash:

 shopt -s globstar 

Une autre approche

find . -name '*.txt' -exec rsync -R {} path/to/dext \;

Accédez au répertoire:

 cp '*.css' /path/to/destination 

Vous devrez naviguer vers chaque dossier du répertoire, mais cela vaut mieux que la plupart des options que j'ai vues jusqu'ici.