Copiez le type de fichier spécifique en conservant la structure des dossiers
On février 10, 2021 by adminJai une structure de dossiers avec un tas de fichiers * .csv dispersés dans les dossiers. Maintenant, je veux copier tous les fichiers * .csv vers une autre destination en conservant la structure des dossiers.
Cela fonctionne en faisant:
cp --parents *.csv /target cp --parents */*.csv" /target cp --parents */*/*.csv /target cp --parents */*/*/*.csv /target ...
et ainsi de suite, mais jaimerais le faire en utilisant une seule commande.
Réponse
find
a une option -exec
très pratique:
find . -name "*.csv" -exec cp --parents \{\} /target \;
Commentaires
- Probablement à cause de cela \ {\} \;
-
'{}'
fonctionne aussi bien - Même si
-execdir
est plus sûr que-exec
, le simple remplacement de lun par lautre ne préserve pas la structure du dossier comme prévu. - Pourquoi je obtenir le message ‘ Omettre le répertoire ‘ lorsque jessaye de les copier avec votre commande?
- Pouvez-vous expliquer pourquoi le les accolades doivent être échappées ici?
Réponse
Vous pouvez également utiliser rsync
pour ceci.
$ rsync -a --prune-empty-dirs --include "*/" --include "*.csv" --exclude "*" source/ target/
Si vous souhaitez conserver les répertoires vides de larborescence source, ignorez loption --prune-empty-dirs
:
$ rsync -a --include "*/" --include "*.csv" --exclude "*" source/ target/
Si vous ne voulez pas que les liens symboliques, les dates de modification, les autorisations de fichier, les propriétaires, etc. soient préservés, veuillez remplacer -a
avec une autre combinaison de -rlptgoD
. 😉
Commentaires
Réponse
Vous pouvez utiliser find et cpio en mode pass through
find . -name "*.csv" | cpio -pdm /target
Ceci trouvera tous les fichiers .csv dans le répertoire courant et ci-dessous et copiez-les dans / target en conservant la structure du répertoire enracinée dans .
.
Si vous utilisez
find /path/to/files -name "*.csv" | cpio -pdm /target
il trouvera tous les fichiers dans /path/to/files
et ci-dessous et les copiera dans /target/path/to/files
et ci-dessous .
Commentaires
- Jai essayé toutes les réponses de haut en bas jusquà celle-ci, et cest la seule qui a fonctionné lors de la première tentative
- Cela devrait être la réponse acceptée.
- Jai trouvé la documentation GNU utile: » En mode copie-pass, [demandé par loption
-p
, cpio] lit la liste des fichiers à copier depuis lentrée standard; le répertoire dans lequel il les copiera est donné comme argument sans option. » … » -d Créez les principaux répertoires si nécessaire. » … » -m Conserve les heures de modification des fichiers précédents lors de la création de fichiers. »
Réponse
La commande cp
autorise plusieurs arguments source:
cp **/*.csv --parents ../target
CAVEAT: Jutilise un glob récursif ici; cest loption globstar
dans Bash 4+ et ksh
et est pris en charge par défaut dans zsh
. Les globes récursifs ne correspond aux fichiers et dossiers cachés, et certaines implémentations suivent des liens symboliques tandis que dautres ne le font pas .
Si votre shell ne le fait pas » t supp ou des globes récursifs, ou si vous « préférez ne pas les utiliser, vous pouvez faire ce qui suit:
-
*.csv */*.csv */*/*.csv */*/*/*.csv
– cest bien sûr très redondant et nécessite de connaître la profondeur de la structure de votre répertoire. -
$(find . -name "*.csv")
– Ce sera correspond aux fichiers et dossiers cachés.find
permet également de spécifier si les liens symboliques sont suivis ou non, ce qui peut être utile.
Commentaires
- cest exactement ce que jai essayé (le glob récursif) et il en a trouvé certains mais pas tous? assez bizarre. Jai obtenu le même résultat exact lors de lutilisation du script npm copyfiles mais si jutilise la commande find, il trouve tout …
- @Randyaa I ‘ Jen ai besoin plus de détails sur les fichiers, exactement, ‘ t trouvés pour vous aider. Vous pouvez trouver la discussion ici et la suite ici sur le comportement précis du glob récursif utile .
- savère que le glob récursif na pas été ‘ activé pour une raison quelconque …Je ‘ je nai jamais rencontré cela avant, mais je lai corrigé avec juste une exécution de
shopt -s globstar
immédiatement avant ma commande et tout va bien. Merci pour le suivi! -
--parents
était ce que je recherchais. merci
Réponse
Celui-ci a fonctionné pour moi:
find -name "*.csv" | xargs cp --parents -t /target
Commentaires
- Meilleure réponse avec la syntaxe la plus simple. Fonctionne très bien et est facile à retenir. Dans de nombreux cas,
find [things] | xargs [do stuff]
est très puissant. - Daccord. Très simple par rapport à certaines des autres réponses.
- Interruptions si vous avez des espaces dans les noms de fichiers
- @MichelePiccolini Les espaces dans les noms de fichiers peuvent être gérés avec
find -print0
etxargs -0
.
Réponse
De rsync
« :
-R, –relative
Utilisez des chemins relatifs. Cela signifie que les noms de chemin complets spécifiés sur la ligne de commande sont envoyés au serveur plutôt que les dernières parties des noms de fichiers. Cela est particulièrement utile lorsque vous souhaitez envoyer plusieurs répertoires différents en même temps. Par exemple, si vous avez utilisé cette commande:
rsync -av /foo/bar/baz.c remote:/tmp/
… cela créerait un fichier nommé baz.c dans / tmp / sur la machine distante. Si à la place vous utilisiez
rsync -avR /foo/bar/baz.c remote:/tmp/
alors un fichier nommé /tmp/foo/bar/baz.c serait créé sur la machine distante, en préservant son chemin complet. Ces éléments de chemin supplémentaires sont appelés » impli ed répertoires « (c.-à-d. les répertoires « foo » et « foo / bar » dans lexemple ci-dessus).
Donc, cela fonctionnerait aussi:
rsync -armR --include="*/" --include="*.csv" --exclude="*" /full/path/to/source/file(s) destination/
Commentaires
- Merci davoir fourni cette réponse. Compatible avec BSD userland (macOS), les chemins et contenant des espaces.
Réponse
En supposant que vous souhaitiez répliquer cette structure de ./source
à ./destination
:
cd source find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)
Je « suis prêt à compter cela comme une ligne, le cd source
étant un shell intégré.
Commentaires
-
tar
a loption-C
pour éviter davoir à changer de répertoire au préalable.
-m
est un raccourci pour--prune-emty-dirs
.-R
peut être ajoutée pour copier la structure du répertoire parent de la source. (cf. ma réponse ici.)