2012-08-21 12 views

Respuesta

0
for i in `find . -type d`; do mkdir -p /tmp/tar_root/`echo $i|sed 's/\.\///'`; done 
pushd /tmp/tar_root 
tar cf tarfile.tar * 
popd 
# rm -fr /tmp/tar_root 
10

Puede utilizar Buscar para obtener los directorios y luego alquitrán ellos:

find .. -type d -print0 | xargs -0 tar cf dirstructure.tar --no-recursion 

Si usted tiene más de alrededor de 10.000 directorios usar lo siguiente para evitar xargs límites:

find . -type d -print0 | tar cf dirstructure.tar --null --files-from - --no-recursion 
+1

necesita un automóvil de 10 segundos? :) – mschr

0

vaya a la carpeta en la que desea comenzar (es por eso que utilizamos find dot) guarde el archivo tar en otro lugar. Creo que tengo un error dejándolo allí mismo. alquitrán con r no c. Creo que con cf sigues creando nuevos archivos y solo obtienes el último conjunto de subdirectorios de archivos. tar r se agrega al archivo tar. --no-recursión porque el find te está dando toda tu lista de archivos ya por lo que no querrás recurse.

buscar. -type d | xargs tar rf /somewhereelse/whatever-dirsonly.tar --no-recursión

tar tvf /somewhereelse/whatever-dirsonly.tar | más para comprobar lo que tienes.

4

Los nombres de directorio que contienen espacios u otros caracteres especiales pueden requerir atención adicional. Por ejemplo:

$ mkdir -p "backup/My Documents/stuff" 
$ find backup/ -type d | xargs tar cf directory-structure.tar --no-recursion 
tar: backup/My: Cannot stat: No such file or directory 
tar: Documents: Cannot stat: No such file or directory 
tar: backup/My: Cannot stat: No such file or directory 
tar: Documents/stuff: Cannot stat: No such file or directory 
tar: Exiting with failure status due to previous errors 

Estas son algunas variaciones para manejar estos casos de nombres de directorio "inusuales":

$ find backup/ -type d -print0 | xargs -0 tar cf directory-structure.tar --no-recursion 

Usando -print0 con find emitirá nombres de archivo como cadenas terminadas en cero; con -0 xargs interpretará los argumentos de la misma manera. Usar null como terminador ayuda a garantizar que incluso los nombres de archivo con espacios y líneas nuevas se interpretarán correctamente.

También es posible que los resultados de tubería recta desde find a tar:

$ find backup/ -type d | tar cf directory-structure.tar -T - --no-recursion 

La invocación de alquitrán con -T - (o --files-de -) hará que se lea los nombres de archivo de la entrada estándar , esperando que cada nombre de archivo esté separado por un salto de línea.

Para el efecto máximo se puede combinar con opciones para cadenas terminadas en cero:

$ find . -type d -print0 | tar cf directory-structure.tar --null --files-from - --no-recursion 

De éstos Considero que esta última versión a ser el más robusto, ya que es compatible con los nombres de archivo inusuales y (a diferencia de xargs) no está intrínsecamente limitado por los tamaños de línea de comando del sistema. (Consulte xargs --show-limits)

Cuestiones relacionadas