Ainsi, vous ne copiez qu'une seule fois les fichiers.
Alors là, j'ai un gros doute... find parcoure toute l'arborescence et cp -r fait des copies récursives...
Allez hop, un petit test, en ajoutant un echo dans le -exec pour juste voir les commandes qui seraient effectuées : find testdir -path testdir/B -prune -o -exec echo cp -r {} testdest/{} \;
cp -r testdir testdest/testdir
cp -r testdir/C testdest/testdir/C
cp -r testdir/C/a testdest/testdir/C/a
cp -r testdir/A testdest/testdir/A
cp -r testdir/A/b testdest/testdir/A/b
cp -r testdir/A/a testdest/testdir/A/a
cp -r testdir/A/A testdest/testdir/A/A
cp -r testdir/A/A/a testdest/testdir/A/A/a
cp -r (récursif) testdir testdest/testdir copie tout le répertoite testdir, puis cp -r testdir/C testdest/testdir/C copie à nouveau le répertoire testdir/C...
Plutôt mortel sur un gros répertoire avec unr arborescence profonde !
Qui plus est, cp -r testdir testdest/testdir va avoir copié le répertoire testdir/B dans la foulée...
La suppression du -r poserait des problèmes avec les répertoires (cp ne copierait pas les répertoires et la tentative de copie dans un répertoire inexistant causerait une erreur).
L'utisation des options -mindepth et -maxdepth permettrait de s'en sortir, pourvu que le sous-répertoire à ne pas copier soit à la base : $ find testdir -mindepth 1 -maxdepth 1 -path testdir/B -prune -o -exec echo cp -a {} testdest/{} \;
cp -a testdir/C testdest/testdir/C
cp -a testdir/A testdest/testdir/A
Et encore faudrait-il avoir créé le répertoire testdest/testdir avant.
Il est egalement possible d'utiliser "tar" qui possede une option d'exclusion (merci daemoOon<) mais qui oblige globalement à copier 2 fois "DIR-SOUSDIR" ce qui peut être long en fonction des données.
C'est plutôt le reste qu'on copierait deux fois, mais on peut s'en sortir en passant par les sortie et entrée standard : $ tar cpf - --exclude B testdir | tar xpvf - -C testdest
testdir/
testdir/C/
testdir/C/a
testdir/A/
testdir/A/b
testdir/A/a
testdir/A/A/
testdir/A/A/a
Qui plus est, dans ce cas, on peut tout-à-fait exclure un répertoire situé plus profondément dans l'arborescence : $ tar cpf - --exclude A/A testdir | tar xpvf - -C testdest
testdir/
testdir/C/
testdir/C/a
testdir/B/
testdir/B/a
testdir/A/
testdir/A/b
testdir/A/a
tar est ton ami. | aussi.
« Le fascisme c’est la gangrène, à Washington comme en Russie. » — adapté de Renaud, Hexagone
# Une seule fois ???
Posté par Arthur Accroc . En réponse au message [Terminal] Exclure un sous-dossier d'une copie recursive. Évalué à 1.
Alors là, j'ai un gros doute...
find parcoure toute l'arborescence et cp -r fait des copies récursives...
Allez hop, un petit test, en ajoutant un echo dans le -exec pour juste voir les commandes qui seraient effectuées :
find testdir -path testdir/B -prune -o -exec echo cp -r {} testdest/{} \;
cp -r testdir testdest/testdir
cp -r testdir/C testdest/testdir/C
cp -r testdir/C/a testdest/testdir/C/a
cp -r testdir/A testdest/testdir/A
cp -r testdir/A/b testdest/testdir/A/b
cp -r testdir/A/a testdest/testdir/A/a
cp -r testdir/A/A testdest/testdir/A/A
cp -r testdir/A/A/a testdest/testdir/A/A/a
cp -r (récursif) testdir testdest/testdir copie tout le répertoite testdir, puis cp -r testdir/C testdest/testdir/C copie à nouveau le répertoire testdir/C...
Plutôt mortel sur un gros répertoire avec unr arborescence profonde !
Qui plus est, cp -r testdir testdest/testdir va avoir copié le répertoire testdir/B dans la foulée...
La suppression du -r poserait des problèmes avec les répertoires (cp ne copierait pas les répertoires et la tentative de copie dans un répertoire inexistant causerait une erreur).
L'utisation des options -mindepth et -maxdepth permettrait de s'en sortir, pourvu que le sous-répertoire à ne pas copier soit à la base :
$ find testdir -mindepth 1 -maxdepth 1 -path testdir/B -prune -o -exec echo cp -a {} testdest/{} \;
cp -a testdir/C testdest/testdir/C
cp -a testdir/A testdest/testdir/A
Et encore faudrait-il avoir créé le répertoire testdest/testdir avant.
C'est plutôt le reste qu'on copierait deux fois, mais on peut s'en sortir en passant par les sortie et entrée standard :
$ tar cpf - --exclude B testdir | tar xpvf - -C testdest
testdir/
testdir/C/
testdir/C/a
testdir/A/
testdir/A/b
testdir/A/a
testdir/A/A/
testdir/A/A/a
Qui plus est, dans ce cas, on peut tout-à-fait exclure un répertoire situé plus profondément dans l'arborescence :
$ tar cpf - --exclude A/A testdir | tar xpvf - -C testdest
testdir/
testdir/C/
testdir/C/a
testdir/B/
testdir/B/a
testdir/A/
testdir/A/b
testdir/A/a
tar est ton ami. | aussi.
« Le fascisme c’est la gangrène, à Washington comme en Russie. » — adapté de Renaud, Hexagone