Copier la structure du dossier (sans fichiers) d'un endroit à un autre
je veux créer un clone de la structure de notre serveur de fichiers multi-teraoctets. Je sais que cp -- parents peut déplacer un fichier et c'est la structure de parent, mais y a-t-il un moyen de copier la structure du répertoire intact?
je veux copier sur un système linux et notre serveur de fichiers est monté sur CIFS.
12 réponses
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 en utilisant rsync:
rsync -av -f"+ */" -f"- *" "$source" "$target"
- on line
- pas de problèmes avec les espaces
- préserver les permissions
Je ne sais pas si vous cherchez une solution sur Linux. Si c'est le cas, vous pouvez essayer ceci:
$ mkdir destdir
$ cd sourcedir
$ find . -type d | cpio -pdvm destdir
cette copie les attributs des répertoires et des fichiers, mais pas les données des fichiers:
cp -R --attributes-only SOURCE DEST
ensuite, vous pouvez supprimer les attributs des fichiers si vous n'êtes pas intéressé par eux:
find DEST -type f -exec rm {} \;
Cela fonctionne:
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.
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
remplacer 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.
cela résout même le problème avec les espaces blancs:
À l'origine, de la source/dir:
find . -type d -exec echo "'{}'" \; > dirs2.txt
puis le recréer dans le dir nouvellement créé:
mkdir -p <../<SOURCEDIR>/dirs2.txt
si vous pouvez obtenir l'accès à partir d'une machine Windows, vous pouvez utiliser xcopy avec /T et /E pour copier juste la structure de chemise (le /e inclut des chemises vides)
[EDIT!]
celui-ci utilise rsync pour recréer la structure du répertoire mais sans les fichiers. http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html
Pourrait en fait être mieux :)
un script python de Sergiy Kolodyazhny posté sur copier seulement les dossiers pas les dossiers? :
#!/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 coque:
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
pour information:
Voici une solution en php que:
- copie les répertoires (pas de façon récursive, un seul niveau)
- préserve les permissions
- contrairement à la solution rsync, est rapide même avec des répertoires contenant des milliers de fichiers car il ne va même pas dans les dossiers
- n'a pas de problèmes avec les espaces
- doit ê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écuter en tant qu'utilisateur qui a les droits suffisants:
sudo php syncDirs.php /var/source /var/destination