web-dev-qa-db-fra.com

Comment puis-je copier de manière récursive des fichiers par extension, en préservant la structure des répertoires?

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

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

71
unclaimedbaggage

Vous pouvez utiliser find et cpio pour le faire

cd /top/level/to/copy
find . -name '*.txt' | cpio -pdm /path/to/destdir

(-updm for overwrite destination content.)
94
Iain
cd /source/path
find -type f -name \*.txt -exec install -D {} /dest/path/{} \;
7
sborsky

Une autre approche

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

2
Marc

Le moyen le plus simple qui a fonctionné pour moi:

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

un problème est que vous devez accéder au répertoire "souhaité" avant que le "chemin parent" soit correct.

Assurez-vous également que vous avez activé les globes récursifs dans bash:

shopt -s globstar
1
icyerasor

que diriez-vous d'abord copiez-le avec

cp -r /old/folder /new/folder

puis allez dans le nouveau dossier et lancez

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 ne l’ai pas testée 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" -print0 |
     cpio -pmd0 /dest-dir

S'il vous plaît _ testez ceci en premier, parce que je ne l'ai pas encore essayé. Si quelqu'un vérifiait, ce serait génial.

1
Dennis Hodapp

Naviguez vers le répertoire:

find . -regex '<regexp_to_get_directories_and_files_you_want>' | xargs -i cp -r --parents {} path/to/destination

C’est un peu plus simple et puissant si vous gérez les expressions régulières.

0
keywalker