J'ai un répertoire foo
avec des sous-répertoires. Je souhaite créer les mêmes noms de sous-répertoires dans un autre répertoire sans copier leur contenu. Comment puis-je faire cela?
Existe-t-il un moyen d'obtenir une ls
sortie sous forme de liste d'extension d'accolades?
find
charge l'interpolation de{}
dans une autre chaîne./source/dir/path
, cela peut échouer avec une erreur « liste d'arguments trop long » lorsque les essais de shell pour appelerfind
à l'expansion de*
. Mieux vaut simplement l'utiliser.
là-bas. De plus, la plupart desfind
implémentations permettent{}
d'être utilisées même lorsqu'elles sont concaténées avec une autre chaîne, mais ce n'est pas universel..
Au lieu de*
dans ce cas. (L'utilisation de xarg pour les performances et la sécurité nécessiterait probablement un script externe pour la concaténation du chemin)En utilisant
rsync
:Cela recréerait la structure de répertoires de
/some/path/dir
commedir
dans le répertoire courant, sans copier aucun fichier.Tout répertoire rencontré dans le chemin source serait créé sur la cible en raison du modèle d'inclusion, mais tout le reste serait exclu. En tant qu'effet secondaire de l'utilisation de
-a
(--archive
), vous obtiendrez les mêmes horodatages sur tous les sous-répertoires de la cible et de la source. Cela fonctionne également pour créer des structures de répertoires locaux à partir de répertoires distants (et vice versa).la source
rsync
!Vous pouvez utiliser
find
pour parcourir la structure source et appelermkdir
pour chaque répertoire qu'il rencontre.Cet exemple, à l'aide de
find
, copiera la structure de votre répertoire defoo
vers/tmp/another/
La
exec
boucle crée l'ensemble des répertoires en dessousfoo
, qui est ensuite transmis aumkdir
. Si vous ne disposez pas d'une versionfind
qui comprend,+
vous pouvez l'utiliser\;
au détriment de l'efficacité. Remplacezmkdir
parecho mkdir
pour voir ce qui se passerait sans le faire.la source
... -exec sh -c 'for dirpath do mkdir -p "/some/path/$dirpath"; done' sh {} +
find: In ‘-exec ... {} +’ the ‘{}’ must appear by itself, but you specified ‘/tmp/another/{}’
(il fonctionne avec-exec ... \;
, cependant)/path/to/{}
mais je ne trouve plus de version où cela fonctionne, j'ai donc adapté la solution. MerciAvec le shell bash, vous pouvez lui demander l'expansion de chaque répertoire avec l'
globstar
option:puis copiez les répertoires avec une boucle:
... ou si vous pensiez qu'ils pourraient tous s'intégrer dans un seul appel à
mkdir
:C'est la syntaxe du tableau bash qui dit: "prenez chaque élément du
$@
tableau et remplacez le début de chacun d'eux par/path/to/dest/
.Je ne suis pas au courant d'un moyen d'obtenir
ls
directement une sortie en tant que liste d'extension d'accolade. Si vous avez essayé de masser la sortie de l'**/
expansion en une extension d'accolade, vous devez faire attention à:{
ou${
séquenceJe ne le recommanderais pas.
la source
La question est une copie intersite de /superuser/1389580/copy-directory-structure-only-at-year-end
Ce type de tâche est un cas d'utilisation classique pour
mtree
:Ce qui précède crée tous les répertoires sous
new-tree
qui étaient présents sousold-tree
.mtree
ne définit pas d'horodatage sur les répertoires nouvellement créés, donc l'arborescence résultante ressemble à ceci:Si vous préférez que les
new-tree
horodatages correspondent à ceux deold-tree
, exécutez simplement àmtree
nouveau. Étant donné que les répertoires existent déjà,mtree
modifieront les horodatages pour correspondre à la spécification source:la source