¿Cómo creo un archivo tar en orden alfabético?


22

Quiero crear un archivo tar donde todos los directorios y archivos se procesen en orden alfabético. Esto es para toda la jerarquía de directorios que se está bloqueando, por lo que comenzaría procesando el primer directorio alfabéticamente, y luego los subdirectorios allí alfabéticamente, etc. Miré a través de la página de manual y no puedo encontrar un interruptor para esto.

Debo admitir que esto es mitad novedad, mitad optimización leve. Simplemente no puedo creer que no haya una manera fácil de hacer esto. Debo estar perdiendo algo.


2
¿Por qué quieres hacer esto?
matthias krull

Principalmente, es porque quiero saber qué tan cerca está de completarse la operación tar. Cuando los archivos se cargan en orden aleatorio, no hay forma de saberlo con el indicador -v.
Erick Robertson

2
Eso no es del todo cierto; Si canaliza la salida a un archivo y conoce la cantidad de archivos (por ejemplo, un comando de búsqueda rápida), puede comparar la salida -v (wc -l) con la cantidad de archivos de la búsqueda para tener una idea del progreso ...
Slartibartfast

2
@matthiaskrull Tengo una razón no relacionada para esto, estoy creando un archivo OVA (que es un archivo tar) para implementar máquinas virtuales en VMWare ESX Server. El OVA necesita archivos en un orden específico dentro de él (el primer archivo debe ser un OVF, etc.).
xask

1
También hay una muy buena razón para esto: el rendimiento en un archivo muy grande cuando desea extraer solo una parte de él. Dado que su orden es aleatorio por defecto, y desea extraer un archivo / directorio, si está ordenado será más rápido, de lo contrario, tendrá que escanear todo el archivo antes de saber que ha terminado.
StormByte

Respuestas:


12

Slartibartfast está en el camino correcto, pero el comportamiento predeterminado de tar es descender a directorios, por lo que puede obtener más de una copia del mismo archivo incluido en el archivo tar generado. Puede verificarlo haciendo tar tf file.tar | sort La solución alternativa es incluir la opción --no-recurssion to tar. Además, debe poder enviar nombres de archivos extraños utilizando la -print0 opción para buscar y luego la --nullopción para tar. El resultado final se ve así:

find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T -

Puede verificar el orden en el archivo tar mediante tar tsf tarfile.tar. Aunque probablemente nunca necesitará las opciones -print0, -z y --null a menos que sepa que va a encontrar un nombre de archivo con una nueva línea incrustada, nunca lo he probado.


Excelente sugerencia para usar la opción --no-recursion, gracias.
Erik

Esta es la solución que funcionó para mí. Tengo un caso de uso diferente al que Erick y Google me trajeron aquí. Estoy recopilando instantáneas con el tiempo del estado completo de un sistema remoto. Los datos son altamente redundantes. Ordenar la entrada de alquitrán por hora (los nombres de archivo tienen una marca de tiempo) mejora el rendimiento del compresor. Una prueba rápida muestra una mejora por el factor 2 (lzma2). Además, no descomprimo el archivo en un sistema de archivos, sino que realizo un procesamiento continuo en las entradas tar. Una secuencia ordenada hace una salida de depuración mucho más agradable y tiene otros beneficios en la cadena de procesos. +1
Johannes

5

El orden de los archivos dentro del archivo tar realmente no importa, ya que cuando se extraen los archivos, el sistema de archivos no conservará el orden de todos modos.

No hay un cambio para esto, pero si realmente lo quisiera, podría proporcionar a tar una lista de nombres de archivos en orden ordenado, y crearía el archivo tar con el orden que le dé.

% tar cf tarfile tmp/diff.txt src/hellow.c junkimage.IMG barry/thegroup
% tar tf tarfile
tmp/diff.txt
src/hellow.c
junkimage.IMG
barry/thegroup

2
o simplemente ordenar la salida:tar tf tarfile | sort
Doug Harris

Tengo demasiados archivos (más de 20,000) para especificarlos todos en la línea de comando.
Erick Robertson

44
El orden de los archivos dentro del archivo tar es importante si necesita descomprimir y mostrar durante la descarga.
Erik

Depende del sistema de archivos.
Thorbjørn Ravn Andersen

4

Suponiendo que no tiene ningún archivo con líneas nuevas en los nombres:

find /source_directory -print | sort | tar -czf target.tgz -T -

Si eso no funciona (nunca lo probé, así que no sé - significa stdin para el argumento -T):

find /source_directory -print | sort > /tmp/temporary_file_list
tar -czf target.tgz -T /tmp/temporary_file_list

Luego está la cuestión de por qué. Pero a veces es más fácil no preguntar.


2
find . -depth -print0 | sort -z | pax -wvd0 > file.tar

Pax es el sucesor POSIX de cpio y tar y fusiona los mejores aspectos de ambos. Escribe archivos tar (ustar) por defecto. También realiza una expansión y solicitud automática de medios e imprime un resumen cuando está hecho.


0

Como alternativa a la respuesta de @ CharlieHerron, si solo está interesado en preservar el contenido (archivos, enlace simbólico) y los metadatos de la carpeta (p. Ej., Permiso de carpeta, mtime, etc.), es posible que desee filtrar las carpetas de la salida de find'.

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.