2010-11-01 35 views
50

Quiero crear un clon de la estructura de nuestro servidor de archivos de varios terabytes. Sé que cp --parents puede mover un archivo y su estructura padre, pero ¿hay alguna forma de copiar la estructura del directorio intacta?Copiar estructura de carpetas (sin archivos) de una ubicación a otra

Quiero copiar a un sistema Linux y nuestro servidor de archivos está montado CIFS allí.

+0

duplicado posible de [? Rsync cómo incluir directorios pero no archivos] (https://stackoverflow.com/questions/3546001/rsync-how-to- include-directories-but-not-files) –

Respuesta

98

Se podría hacer algo como:

find . -type d >dirs.txt 

para crear la lista de directorios, entonces

xargs mkdir -p <dirs.txt 

para crear los directorios en el destino.

+17

linux es increíble – user1167442

+5

Esta solución no funcionará si tiene espacios en los nombres de su directorio. – Jealie

+10

@Jealie Cambia los comandos a 'encontrar. -type d -print0> dirs.txt' y 'xargs -0 mkdir -p user1207177

0

Si se puede obtener acceso desde un equipo Windows, puede utilizar xcopy con/T y/E para copiar sólo la estructura de carpetas (la/E incluye las carpetas vacías)

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

[EDICIÓN! ]

Este usa rsync para recrear la estructura del directorio pero sin los archivos. http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html

en realidad podría ser mejor :)

+0

Linux, hombre. Linux. No Ventana $. – amphetamachine

+1

Desafortunadamente, nuestro servidor de archivos que sirve CIFS no está ejecutando Windows, por lo que no puede hacerlo en los comandos de ganar. – r00fus

+0

Gracias, el método rsync funcionó perfectamente bien para mí. Es compatible también con espacios en nombres de directorio. – Glutanimate

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

funciona como magia;) – Volvox

+0

¡Este es el mejor consejo! : –

+2

La mejor respuesta mía con el hallazgo. De lo contrario, puede probar la solución 'rsync' de la respuesta de Chen Levy en [esta pregunta SO] (http://stackoverflow.com/questions/11946465/copy-a-directory-structure-with-file-names-without-content) –

5

No sé si estás buscando una solución para Linux. Si es así, puede intentar esto:

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

cpio no parece funcionar para mí, al menos con los parámetros que ha especificado. – r00fus

+0

@ r00fus: lea el manual de cpio o consulte http://www.gnu.org/software/cpio/ – zerodin

1

Sustituto target_dir y source_dir con los valores apropiados:

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

Probado en OSX + Ubuntu.

1

La siguiente solución ha funcionado bien para mí en varios ambientes:

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

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

Esto funciona:

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

basta con sustituir SOURCE_DIR y DEST_DIR.

3

Esta copia de los directorios y los atributos de los archivos, pero no los archivos de datos:

cp -R --attributes-only SOURCE DEST 

A continuación, puede eliminar los archivos de atributos si no está interesado en ellos:

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

¡Simplemente excelente !. – WebComer

+0

Sería excelente, pero olvidó mencionar la propiedad de ahorro, la marca de tiempo y los permisos. Por lo tanto, produjo un caos en Win7/cygwin - usuario NULL_SID, orden de permisos incorrecta, no puede editar permisos, etc. y no puede acceder a la estructura de archivos producida. – WebComer

0

un script en Python de Sergiy Kolodyazhnyy publicada el 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)) 

o desde el 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 

FYI:

9

Aquí es una solución simple usando rsync:

rsync -av -f"+ */" -f"- *" "$source" "$target" 
  • una línea
  • no hay problemas con espacios
  • conservan permisos

I found this solution there

1

Esto resuelve incluso el problema con espacios en blanco:

En el dir/fuente original:

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

continuación, volver a crearlo en el directorio recién creado:

mkdir -p <../<SOURCEDIR>/dirs2.txt 
Cuestiones relacionadas