it-swarm.com.de

Kopieren Sie die Ordnerstruktur (Sans-Dateien) von einem Ort an einen anderen

Ich möchte einen Klon der Struktur unseres Multi-Terabyte-Dateiservers erstellen. Ich weiß, dass cp --parents eine Datei und ihre übergeordnete Struktur verschieben kann, aber gibt es eine Möglichkeit, die Verzeichnisstruktur intakt zu kopieren? 

Ich möchte in ein Linux-System kopieren, und unser Dateiserver ist dort CIFS.

69
r00fus

Sie könnten so etwas tun:

find . -type d >dirs.txt

um die Liste der Verzeichnisse zu erstellen, dann

xargs mkdir -p <dirs.txt

um die Verzeichnisse am Zielort anzulegen.

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

Hier ist eine einfache Lösung mit rsync:

rsync -av -f"+ */" -f"- *" "$source" "$target"
  • eine Linie
  • keine Probleme mit Leerzeichen
  • berechtigungen beibehalten

Ich habe diese Lösung dort gefunden

19
Gildas

Ich weiß nicht, ob Sie nach einer Lösung unter Linux suchen. Wenn ja, können Sie dies versuchen:

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

Dies kopiert die Verzeichnisse und Dateienattribute, nicht jedoch die Dateidaten:

cp -R --attributes-only SOURCE DEST

Dann können Sie die Dateiattribute löschen, wenn Sie nicht daran interessiert sind:

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

Das funktioniert:

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

Ersetzen Sie einfach SOURCE_DIR und DEST_DIR.

2
mijhael3000

Ersetzen Sie target_dir und source_dir durch die entsprechenden Werte:

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

Unter OSX + Ubuntu getestet.

1
luissquall

Die folgende Lösung hat für mich in verschiedenen Umgebungen gut funktioniert:

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

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

Dies löst sogar das Problem mit Whitespaces:

Im Original-/Quellverzeichnis:

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

dann erstellen Sie es im neu erstellten Verzeichnis neu:

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

Ein anderer Ansatz ist die Verwendung der tree, die aufgrund ihrer starken Optionen sehr praktisch ist und in Verzeichnisbäumen navigiert. Es gibt Optionen nur für Verzeichnisse, leere Verzeichnisse ausschließen, Namen mit Muster ausschließen, nur Namen mit Muster einschließen usw. man tree auschecken

Vorteil : Sie können die Liste bearbeiten oder überprüfen, oder wenn Sie häufig Skripte ausführen und einen Stapel leerer Verzeichnisse erstellen

Ansatz : Erstellen Sie eine Liste von Verzeichnissen mit tree, verwenden Sie diese Liste als Argumente für mkdir

tree -dfi --noreport > some_dir_file.txt

-dfi listet nur Verzeichnisse auf, gibt den vollständigen Pfad für jeden Namen aus und bewirkt, dass der Baum die Einrückungslinien nicht druckt.

--noreport Lässt das Drucken des Datei- und Verzeichnisberichts am Ende der Baumstruktur aus, damit die Ausgabedatei keine Flusen enthält

Dann zu dem Ziel gehen, wo Sie die leeren Verzeichnisse wollen und ausführen

xargs mkdir < some_dir_file.txt
0
brother-bilo

Ein Python-Skript von Sergiy Kolodyazhnyy Auf Nur Ordner kopieren, keine Dateien? :

#!/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)) 

oder aus der Shell:

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

Zu Ihrer Information:

0

Hier ist eine Lösung in PHP, die:

  • kopiert die Verzeichnisse (nicht rekursiv, nur eine Ebene)
  • behält die Berechtigungen bei
  • im Gegensatz zur rsync-Lösung ist es selbst bei Verzeichnissen mit Tausenden von Dateien schnell, da es nicht einmal in die Ordner geht
  • hat keine Probleme mit Leerzeichen
  • sollte leicht lesbar und einstellbar sein

Erstellen Sie eine Datei wie syncDirs.php mit diesem Inhalt:

<?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());
}

Führen Sie es als Benutzer aus, der über ausreichende Rechte verfügt:

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

0
Christopher K.