¿Existe un tar o cpio más inteligente para recuperar de manera eficiente un archivo almacenado en el archivo?

24

Estoy usando tarpara archivar un grupo de archivos muy grandes (multi-GB) bz2.

Si uso tar -tf file.tarpara enumerar los archivos dentro del archivo, esto lleva mucho tiempo en completarse (~ 10-15 minutos).

Del mismo modo, cpio -t < file.cpiolleva el mismo tiempo completarlo, más o menos unos segundos.

En consecuencia, recuperar un archivo de un archivo (a través de, tar -xf file.tar myFileOfInterest.bz2por ejemplo) es tan lento.

¿Existe algún método de archivo que mantenga un "catálogo" fácilmente disponible con el archivo, de modo que se pueda recuperar rápidamente un archivo individual dentro del archivo?

Por ejemplo, algún tipo de catálogo que almacena un puntero a un byte particular en el archivo, así como el tamaño del archivo que se va a recuperar (así como cualquier otro dato específico del sistema de archivos).

¿Existe una herramienta (o argumento para taro cpio) que permita la recuperación eficiente de un archivo dentro del archivo?

Alex Reynolds
fuente

Respuestas:

15

tar (y cpio y afio y pax y programas similares) son formatos orientados a la transmisión: están destinados a ser transmitidos directamente a una cinta o canalizados a otro proceso. mientras que, en teoría, sería posible agregar un índice al final del archivo / secuencia, no conozco ninguna versión que lo haga (aunque sería una mejora útil)

no ayudará con sus archivos tar o cpio existentes, pero hay otra herramienta, dar ("archivo de disco"), que crea archivos de archivo que contienen dicho índice y puede brindarle acceso rápido y directo a archivos individuales dentro del archivo .

si dar no está incluido con su unix / linux-dist, puede encontrarlo en:

http://dar.linux.free.fr/

cas
fuente
¿Hay alguna manera de canalizar una extracción a la salida estándar? Parece que hay una manera de hacer un archivo a partir de la entrada estándar, pero no una manera (al menos no directamente) de extraerlo a la salida estándar. No está claro en la documentación si hay una manera de hacer esto. ¿Sabes cómo se puede lograr esto?
Alex Reynolds
1
No, no lo sé. En realidad no uso dar yo mismo ... solo sé que existe. Estoy bastante contento con tar, y tiendo a crear simplemente archivos de texto que enumeren el contenido de los archivos tar grandes que me gustaría buscar más tarde. puede hacer esto al mismo tiempo que crea el archivo tar utilizando la opción v dos veces (por ejemplo, "tar cvvjf /tmp/foo.tar.bz2 / path / to / backup> /tmp/foo.txt")
cas
10

Podrías usar SquashFS para dichos archivos. Es

  • diseñado para acceder mediante un controlador de fusible (aunque existe una interfaz tradicional)
  • comprimido (cuanto mayor sea el tamaño del bloque, más eficiente)
  • incluido en el kernel de Linux
  • almacena UID / GID y tiempo de creación
  • consciente de la resistencia, por lo tanto bastante portátil

El único inconveniente que conozco es que es de solo lectura.

http://squashfs.sourceforge.net/ http://www.tldp.org/HOWTO/SquashFS-HOWTO/whatis.html

MauganRa
fuente
8

Si bien no almacena un índice, starse supone que es más rápido que tar. Además, admite nombres de archivo más largos y tiene un mejor soporte para los atributos de archivo.

Como estoy seguro de que sabe, descomprimir el archivo lleva tiempo y probablemente sería un factor en la velocidad de extracción, incluso si hubiera un índice.

Editar: es posible que también desee echar un vistazo xar. Tiene un encabezado XML que contiene información sobre los archivos en el archivo.

De la página referenciada:

El encabezado XML de Xar le permite contener metadatos arbitrarios sobre los archivos contenidos en el archivo. Además de los metadatos de archivos estándar de Unix, como el tamaño del archivo y sus tiempos de modificación y creación, xar puede almacenar información como bits de archivo ext2fs y hfs, indicadores de Unix, referencias a atributos extendidos, información del Finder de Mac OS X, Mac OS Bifurcaciones de recursos X y hashes de los datos del archivo.

Pausado hasta nuevo aviso.
fuente
+1 por alertarme sobre una herramienta de sonido útil de la que nunca había oído hablar antes.
cas
Link of staris down ......
Pacerier
5

Thorbjørn Ravn Anderser tiene razón. GNU tar crea archivos "buscables" por defecto. Pero no usa esa información cuando lee estos archivos si no se da la opción -n. Con la opción -n, acabo de extraer un archivo de 7GB del archivo de 300GB en el tiempo requerido para leer / escribir 7GB. Sin -n tomó más de una hora y no produjo ningún resultado.

No estoy seguro de cómo la compresión afecta esto. Mi archivo no fue comprimido. Los archivos comprimidos no son "buscables" porque el alquitrán actual (1.26) GNU descarga la compresión al programa externo.

Aidas Kasparas
fuente
de acuerdo con la página de manual de tar man7.org/linux/man-pages/man1/tar.1.html , GNU tar utilizará por defecto el formato de búsqueda al escribir, y si el archivo es de búsqueda, lo usará al leer (para lista o extracto). Si está utilizando GNU tar y aún ve el problema, debe presentar un informe de error con GNU.
Brian Minton
77
Si leo el manual correctamente, nunca dice que tiene ningún tipo de índice y puede saltar a cualquier archivo dentro del archivo dado el nombre del archivo. --seek solo significa que se pueden buscar los medios subyacentes, de modo que cuando se lee desde el principio, puede omitir la lectura del contenido del archivo, pero aún necesita leer los encabezados de entrada desde el principio. Dicho esto, si tiene un archivo con 1M de archivos e intenta extraer el último, con --no-seek, necesita leer el contenido de todos los archivos; con --seek, solo necesita leer encabezados de 1M, uno para cada archivo, pero aún así es muy lento.
icando
4

El único formato de archivo que conozco que almacena un índice es ZIP, porque he tenido que reconstruir índices corruptos más de una vez.

womble
fuente
2

No sé qué índice sé, pero uso volcado y restauración con archivos grandes, y navegar por el árbol de restauración en modo interactivo para seleccionar archivos aleatorios es MUY rápido.

MediaManNJ
fuente
2

Puede usar el formato de archivo / compresión 7z (7zip) si tiene acceso al p7zip-fullpaquete.

En Ubuntu puedes usar este comando para instalarlo:

$ sudo apt-get install p7zip-full

Para crear un archivo que puede usar 7z a <archive_name> <file_or_directory>y si no desea comprimir los archivos y simplemente quiere "almacenarlos" tal cual, puede usar la -mx0opción como:

$ 7z a -mx0 myarchive.7z myfile.txt

Creating archive myarchive.7z

Luego puede extraer los archivos usando 7z e:

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

O puede enumerar el índice del archivo con el 7z lque es útil para buscar con grep:

$ 7z l myarchive.7z | grep

2014-07-08 12:13:39 ....A            0            0  myfile.txt

Esta es también la topción para probar la integridad, uagregar / actualizar un archivo al archivo y deliminar un archivo.

NOTA IMPORTANTE
Do no utilizar el formato 7zip para Linux del sistema de archivos de copias de seguridad, ya que no almacena el propietario y el grupo de los archivos contenidos.

cómplice
fuente
Para Linux estaría bien comprimir un archivo tar.
Thorbjørn Ravn Andersen
1

Creo que GNU tar es capaz de hacer lo que quieres, pero no puedo encontrar un recurso definitivo que lo diga.

En cualquier caso, necesita un formato de archivo con un índice (ya que eso le permitirá hacer lo que quiera). No creo que los archivos ZIP puedan crecer tanto, desafortunadamente.

Thorbjørn Ravn Andersen
fuente
Los archivos ZIP pueden crecer mucho .
Pacerier
1
Si leo el manual correctamente, nunca dice que tiene ningún tipo de índice y puede saltar a cualquier archivo dentro del archivo dado el nombre del archivo. --seek solo significa que se pueden buscar los medios subyacentes, de modo que cuando se lee desde el principio, puede omitir la lectura del contenido del archivo, pero aún necesita leer los encabezados de entrada desde el principio. Dicho esto, si tiene un archivo con 1M de archivos e intenta extraer el último, con --no-seek, necesita leer el contenido de todos los archivos; con --seek, solo necesita leer encabezados de 1M, uno para cada archivo, pero aún así es muy lento.
icando
2
@Pacerier A mi entender, el formato ZIP64 permite archivos muy grandes, pero el formato ZIP original no.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen, un solo archivo de 4 GB es un gran amigo.
Pacerier
3
@Pacerier 4GB no ha sido grande desde que los ISO de DVD aparecieron en escena hace casi veinte años. Terrabytes es grande hoy en día.
oligofren