2010-11-01 14 views
50

Voglio creare un clone della struttura del nostro file server multi-terabyte. So che cp -parents può spostare un file e la sua struttura genitoriale, ma esiste un modo per copiare la struttura della directory intatta?Copia la struttura della cartella (senza file) da una posizione all'altra

Voglio copiare su un sistema linux e il nostro file server è montato sul CIFS.

+0

Eventuali duplicati di [? Rsync come includere le directory ma non i file] (https://stackoverflow.com/questions/3546001/rsync-how-to- include-directories-but-not-files) –

risposta

98

Si potrebbe fare qualcosa di simile:

find . -type d >dirs.txt 

per creare la lista di directory, quindi

xargs mkdir -p <dirs.txt 

per creare le directory del destinazione.

+17

linux è sorprendente – user1167442

+5

Questa soluzione non funzionerà se si dispone di spazi nei nomi delle directory. – Jealie

+10

@Jealie Cambia i comandi per 'trovare. -type d -print0> dirs.txt' e 'xargs -0 mkdir -p user1207177

0

Se si può ottenere l'accesso da un computer Windows, è possibile utilizzare xcopy con/T e/E per copiare solo la struttura delle cartelle (la/E comprende le cartelle vuote)

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

[EDIT! ]

Questo utilizza rsync per ricreare la struttura della directory ma senza i file. http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html

potrebbe effettivamente essere meglio :)

+0

Linux, uomo. Linux. Non finestra $. – amphetamachine

+1

Sfortunatamente, il nostro server di file che serve CIFS non sta eseguendo Windows, quindi non può farlo sui comandi di vittoria. – r00fus

+0

Grazie, il metodo rsync ha funzionato perfettamente per me. È compatibile anche con gli spazi nei nomi delle directory. – Glutanimate

50
cd /path/to/directories && 
find . -type d -exec mkdir -p -- /path/to/backup/{} \; 
+0

funziona come per magia;) – Volvox

+0

Questo è l'ultimo consiglio! : –

+2

La migliore risposta da me con find. Altrimenti puoi provare la soluzione 'rsync' dalla risposta Chen Levy in [questa domanda SO] (http://stackoverflow.com/questions/11946465/copy-a-directory-structure-with-file-names-without-content) –

5

Non so se stai cercando una soluzione su Linux. Se è così, si può provare questo:

$ mkdir destdir 
$ cd sourcedir 
$ find . -type d | cpio -pdvm destdir 
+0

cpio non sembra funzionare per me, almeno con i parametri specificati. – r00fus

+0

@ r00fus - si prega di leggere il manuale per cpio o consultare http://www.gnu.org/software/cpio/ – zerodin

1

sostituto target_dir e source_dir con i valori appropriati:

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

Testato su OSX + Ubuntu.

1

La seguente soluzione ha funzionato bene per me in vari ambienti:

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

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

Questo funziona:

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

Basta sostituire dir_sorgente e DEST_DIR.

3

Questa copia le directory e gli attributi dei file, ma non i file di dati:

cp -R --attributes-only SOURCE DEST 

Quindi è possibile eliminare i file attributi se non siete interessati a loro:

find DEST -type f -exec rm {} \; 
+0

Semplicemente eccellente !. – WebComer

+0

Sarebbe eccellente, ma hai dimenticato di menzionare il salvataggio di proprietà, timestamp e permessi. Quindi ha prodotto un pasticcio in Win7/cygwin - NULL_SID utente, ordine di autorizzazioni errato, non può modificare permessi, ecc. E non può accedere alla filestruttura prodotta. – WebComer

0

uno script python da Sergiy Kolodyazhnyy postato su Copy only folders not files?:

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

o dalla 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 

proposito:

9

Ecco una soluzione semplice utilizzando rsync:

rsync -av -f"+ */" -f"- *" "$source" "$target" 
  • una riga
  • problemi con spazi
  • conservano autorizzazioni

I found this solution there

1

Questo risolve anche il problema con spaziature:

Nel dir/fonte originale:

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

poi ricrearlo nella directory appena creata:

mkdir -p <../<SOURCEDIR>/dirs2.txt 
Problemi correlati