J'ai 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 je voudrais le faire en utilisant une commande.
'{}'
fonctionne aussi bien-execdir
est plus sûr-exec
, le simple fait de remplacer l’un par l’autre ne préserve pas la structure du dossier comme prévu.Vous pouvez également utiliser
rsync
pour cela.Si vous souhaitez conserver les répertoires vides de l'arborescence source, ignorez l'
--prune-empty-dirs
option suivante:Si vous ne souhaitez pas que les liens symboliques, les dates de modification, les autorisations de fichiers, les propriétaires, etc. soient conservés, veuillez les remplacer
-a
par une autre combinaison de-rlptgoD
. ;-)la source
-m
est un raccourci pour--prune-emty-dirs
.-R
option peut être ajoutée pour copier la structure de répertoires parent de source. (cf. ma réponse ici.)Vous pouvez utiliser find et cpio en mode pass through
Cela trouvera tous les fichiers .csv dans le répertoire en cours et ci-dessous et les copiera dans / target en conservant la structure de répertoires enracinée dans
.
.Si tu utilises
il trouvera tous les fichiers dans
/path/to/files
et ci-dessous et les copiera dans/target/path/to/files
et ci-dessous.la source
La
cp
commande autorise plusieurs arguments source:CAVEAT: J'utilise un globe récursif ici; c'est l'
globstar
option dans Bash 4+ etksh
, et est supporté par défaut danszsh
. Les objets globaux récursifs ne correspondent pas aux fichiers et dossiers cachés, et certaines implémentations suivent des liens symboliques, d'autres non .Si votre shell ne prend pas en charge les objets globaux récursifs, ou si vous préférez ne pas les utiliser, vous pouvez procéder comme suit:
*.csv */*.csv */*/*.csv */*/*/*.csv
- Ceci est 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 correspondre les fichiers et dossiers cachés.find
prend également en charge de spécifier si les liens symboliques sont suivis ou non, ce qui peut être utile.la source
shopt -s globstar
juste avant ma commande et tout va bien. Merci pour le suivi!--parents
était ce que je cherchais. merciCelui-ci a fonctionné pour moi:
find -name "*.csv" | xargs cp --parents -t /target
la source
find [things] | xargs [do stuff]
c'est très puissant.find -print0
etxargs -0
.En supposant que vous souhaitiez répliquer cette structure de
./source
vers./destination
:Je suis prêt à compter cela comme une ligne, le
cd source
shell étant intégré.la source
tar
a la-C
possibilité d'éviter de devoir changer le répertoire en premier.De
rsync
la page de manuel de:Donc, cela fonctionnerait aussi:
la source