web-dev-qa-db-fra.com

Copier la structure de dossiers (sans fichiers) d'un emplacement à un autre

Je souhaite créer un clone de la structure de notre serveur de fichiers de plusieurs téraoctets. Je sais que cp --parents peut déplacer un fichier et sa structure parente, mais existe-t-il un moyen de copier la structure de répertoires intacte? 

Je veux copier sur un système Linux et notre serveur de fichiers est CIFS monté là-bas.

69
r00fus

Vous pourriez faire quelque chose comme:

find . -type d >dirs.txt

pour créer la liste des répertoires, puis

xargs mkdir -p <dirs.txt

pour créer les répertoires sur la destination.

128
Greg Hewgill
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;
63
amphetamachine

Voici une solution simple utilisant rsync:

rsync -av -f"+ */" -f"- *" "$source" "$target"
  • une ligne
  • pas de problèmes d'espaces
  • conserver les autorisations

J'ai trouvé cette solution là-bas

19
Gildas

Je ne sais pas si vous recherchez une solution sous Linux. Si oui, vous pouvez essayer ceci:

$ mkdir destdir
$ cd sourcedir
$ find . -type d | cpio -pdvm destdir
6
zerodin

Cette copie les attributs de répertoires et de fichiers, mais pas les données de fichiers:

cp -R --attributes-only SOURCE DEST

Ensuite, vous pouvez supprimer les attributs de fichiers si cela ne vous intéresse pas:

find DEST -type f -exec rm {} \;
4
toliveira

Cela marche:

find ./<SOURCE_DIR>/ -type d | sed 's/\.\/<SOURCE_DIR>//g' | xargs -I {} mkdir -p <DEST_DIR>"/{}"

Il suffit de remplacer SOURCE_DIR et DEST_DIR.

2
mijhael3000

Remplacez target_dir et source_dir par les valeurs appropriées:

cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}"

Testé sur OSX + Ubuntu.

1
luissquall

La solution suivante a bien fonctionné pour moi dans divers environnements:

sourceDir="some/directory"
targetDir="any/other/directory"

find "$sourceDir" -type d | sed -e "s?$sourceDir?$targetDir?" | xargs mkdir -p
1
yaccob

Cela résout même le problème des espaces:

Dans le répertoire original/source:

find . -type d -exec echo "'{}'" \; > dirs2.txt

puis recréez-le dans le répertoire nouvellement créé:

mkdir -p <../<SOURCEDIR>/dirs2.txt
1
Thim

Une autre approche consiste à utiliser la variable tree qui est très pratique et à parcourir les arborescences de répertoires en fonction de ses options avancées. Il existe des options pour les répertoires uniquement, exclure les répertoires vides, exclure les noms avec un motif, inclure uniquement les noms avec un motif, etc. Extraire man tree

Avantage : vous pouvez modifier ou réviser la liste, ou si vous utilisez beaucoup de scripts et créez fréquemment un lot de répertoires vides

Approach : crée une liste de répertoires à l'aide de tree, utilise cette liste comme entrée d'argument pour mkdir

tree -dfi --noreport > some_dir_file.txt

-dfi répertorie uniquement les répertoires, affiche le chemin complet pour chaque nom, empêche l’arborescence d’imprimer les lignes de retrait,

--noreport Omet l’impression du rapport de fichier et de répertoire à la fin de la liste, pour que le fichier de sortie ne contienne aucun fluff

Ensuite, allez à la destination où vous voulez les répertoires vides et exécutez

xargs mkdir < some_dir_file.txt
0
brother-bilo

Un script python de Sergiy Kolodyazhnyy Posté sur Copier uniquement les dossiers, pas les fichiers? :

#!/usr/bin/env python
import os,sys
dirs=[ r for r,s,f in os.walk(".") if r != "."]
for i in dirs:
    os.makedirs(os.path.join(sys.argv[1],i)) 

ou de la coquille:

python -c 'import os,sys;dirs=[ r for r,s,f in os.walk(".") if r != "."];[os.makedirs(os.path.join(sys.argv[1],i)) for i in dirs]' ~/new_destination

FYI:

0
Franck Dernoncourt

Voici une solution en php qui:

  • copie les répertoires (pas récursivement, un seul niveau)
  • conserve les autorisations
  • contrairement à la solution rsync, elle est rapide même avec des répertoires contenant des milliers de fichiers car elle ne va même pas dans les dossiers
  • n'a pas de problèmes d'espaces
  • devrait être facile à lire et à ajuster

Créez un fichier comme syncDirs.php avec ce contenu:

<?php
foreach (new DirectoryIterator($argv[1]) as $f) {
    if($f->isDot() || !$f->isDir()) continue;
        mkdir($argv[2].'/'.$f->getFilename(), $f->getPerms());
        chown($argv[2].'/'.$f->getFilename(), $f->getOwner());
        chgrp($argv[2].'/'.$f->getFilename(), $f->getGroup());
}

Exécutez-le en tant qu'utilisateur disposant de droits suffisants:

Sudo php syncDirs.php /var/source /var/destination

0
Christopher K.