¿Cómo tar archivos con un orden ordenado?

10

Si tarutiliza un directorio de forma recursiva, solo utiliza el orden de los sistemas operativos readdir.

Pero en algunos casos es bueno tar los archivos ordenados.

¿Cuál es una buena manera de tar un directorio ordenado alfabéticamente?


Tenga en cuenta que, a los fines de esta pregunta, gnu-tar en un sistema Linux típico está bien.

ideasman42
fuente
posible duplicado de abajo, marque a continuación enlaces unix.stackexchange.com/questions/120143/... superuser.com/questions/172367/...
Jaymin Dabhi
Vi esto, pero no estoy preguntando cómo se establece el orden, sino que quiero ordenarlos.
ideasman42
Consulte también unix.stackexchange.com/a/67018 para ordenar un árbol de directorios por nombre.
Stéphane Chazelas

Respuestas:

17

Para un GNU tar:

--sort=ORDER
 Specify the directory sorting order when reading directories.
 ORDER may be one of the following:

`none'
      No directory sorting is performed. This is the default.

`name'
      Sort the directory entries on name. The operating system may
      deliver directory entries in a more or less random order, and
      sorting them makes archive creation reproducible.

`inode'
      Sort the directory entries on inode number. Sorting
      directories on inode number may reduce the amount of disk
      seek operations when creating an archive for some file
      systems.

Probablemente también quieras mirar --preserve-order.

mikeserv
fuente
8
--sortse introdujo en la versión tar 1.28. --preserve-orderno es relevante para esta pregunta.
mhsmith
Sigo teniendo tar: Exiting with failure status due to previous errorserrores. @mhsmith
Alper
3

Con zsh, en lugar de:

pax -w dir

Utilizar:

pax -dw dir dir/**/*(D)

Puede hacer lo mismo con versiones recientes de bash -O globstar -O dotglobwith:

pax -dw dir/**

O versiones recientes de FIGNORE='@(.|..)' ksh93 -o globstarcon:

pax -dw dir dir/**

paxes el comando estándar para crear tararchivos. La salida va a stdout. Los globos de concha se ordenan por nombre.

Si se encuentra con un error de lista Arg demasiado largo , puede cambiar a:

printf '%s\0' dir dir/**/*(D) | pax -0dw

( aunque no todas las paximplementaciones son compatibles -0).

Stéphane Chazelas
fuente
2

taren sí mismo no puede hacer esto, por lo que debe crearlo a partir de una lista ordenada correctamente. En principio, podría usar tarla -Topción 's' , pero no hay forma de especificar que los nombres de archivo en esa lista se terminen con NUL. Entonces, si tiene nombres de archivo con nuevas líneas (lo que está permitido), esto simplemente se romperá.

Una mejor opción es usarlo cpiopara generar los archivos, ya que acepta una lista de nombres de archivo terminados en NUL y puede generar archivos tar.

Si su tarcomando fuera:

tar cvf /somedir/all.tar .

Luego, para que esto se ordene por nombre, debe hacer (suponiendo que GNU find y cpio):

find . -type f -print0 | sort -z | \
  cpio --create --null --format=ustar -O /somedir/all.tar

Sin embargo, esto tiene la desventaja de que los subdirectorios se colocan entre los nombres de archivo. Puede hacer trucos con finds -printf0 especificando el directorio y la información de profundidad y ordenando, sort -npero eso también influye en cómo se ordenan los archivos con números dentro de un directorio.

Si lo anterior no es satisfactorio, probablemente podría usar un pequeño programa basado en Python os.walk()para generar el orden que desee con control total (profundidad primero, basada en la extensión, etc.), pero si sigue esa ruta, también podría abandonar cpioy escribir el tararchivo con el tarfilemódulo de Python .

Anthon
fuente
1
--null especifica que -T toma cadenas terminadas en nulo.
psusi