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.

65
demandé sur r00fus 2010-11-02 02:30:59

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.

124
répondu Greg Hewgill 2010-11-01 23:37:12
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;
59
répondu amphetamachine 2010-11-01 23:39:26

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

j'y ai trouvé cette solution

14
répondu Gildas 2017-08-30 12:07:23

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
5
répondu zerodin 2015-09-23 16:04:33

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 {} \;
4
répondu toliveira 2015-12-27 17:15:42

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.

2
répondu mijhael3000 2016-12-04 08:47:21

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
répondu yaccob 2013-07-22 16:07:51

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.

1
répondu luissquall 2016-08-30 13:40:33

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
1
répondu Thim 2017-12-18 13:32:37

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)

http://ss64.com/nt/xcopy.html

[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 :)

0
répondu dotalchemy 2010-11-01 23:39:26

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:

0
répondu Franck Dernoncourt 2017-08-08 23:13:20

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

0
répondu Christopher K. 2018-07-25 18:02:22