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.
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.
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;
Voici une solution simple utilisant rsync:
rsync -av -f"+ */" -f"- *" "$source" "$target"
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
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 {} \;
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.
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.
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
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
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
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:
Voici une solution en php qui:
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