Come tarare i file con un ordine ordinato?


10

Se si tarricorre in modo ricorsivo a una directory, utilizza semplicemente l'ordine dei SO readdir.

Ma in alcuni casi è bello tarare i file ordinati.

Qual è un buon modo per tarare una directory in ordine alfabetico?


Nota, ai fini di questa domanda, gnu-tar su un tipico sistema Linux va bene.


possibile duplicato di seguito, controlla sotto i collegamenti unix.stackexchange.com/questions/120143/… superuser.com/questions/172367/…
Jaymin Dabhi

Ho visto questo, ma non sto chiedendo come è impostato l'ordine, invece voglio ordinarli.
ideasman42

Vedere anche unix.stackexchange.com/a/67018 per ordinare un albero di directory in base al nome.
Stéphane Chazelas,

Risposte:


17

Per 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.

Probabilmente vorrai anche dare un'occhiata --preserve-order.


8
--sortè stato introdotto nella versione tar 1.28. --preserve-ordernon è rilevante per questa domanda.
mhsmith

Continuo ad avere tar: Exiting with failure status due to previous errorserrori. @mhsmith
Alper

3

Con zsh, invece di:

pax -w dir

Uso:

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

Puoi fare lo stesso con le versioni recenti di bash -O globstar -O dotglobcon:

pax -dw dir/**

O versioni recenti di FIGNORE='@(.|..)' ksh93 -o globstarcon:

pax -dw dir dir/**

paxè il comando standard per creare tarfile. L'output va allo stdout. I globs della shell sono ordinati per nome.

Se si verifica un errore troppo lungo in un elenco Arg , è possibile passare a:

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

(non tutte le paximplementazioni supportano -0però).


2

tardi per sé non può farlo, quindi è necessario crearlo da un elenco ordinato correttamente. In linea di principio è quindi possibile utilizzare tarl' -Topzione, ma non è possibile specificare che i nomi dei file in tale elenco debbano essere chiusi NUL. Quindi, se hai nomi di file con nuove righe (che è consentito), questo si interromperà.

Un'opzione migliore è utilizzare cpioper generare i file in quanto accetta un elenco di nomi di file terminato NUL e può generare file tar.

Se il tuo tarcomando fosse:

tar cvf /somedir/all.tar .

Quindi per ordinarlo in base al nome, dovresti fare (supponendo che GNU find e cpio):

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

Questo ha lo svantaggio però che le sottodirectory sono inserite tra i nomi dei file. Puoi fare trucchi con finds -printf0 specificando la directory e le informazioni sulla profondità e l'ordinamento, sort -nma ciò influenza anche il modo in cui i file con i numeri sono ordinati all'interno di una directory.

Se quanto sopra non è soddisfacente, potresti probabilmente utilizzare un piccolo programma Python basato su os.walk()per generare l'ordinamento desiderato con il controllo completo (profondità prima, basata sull'estensione, ecc.), Ma se segui quel percorso potresti anche rilasciare cpioe scrivere il tarfile con il tarfilemodulo di Python .


1
--null specifica che -T accetta stringhe terminate null.
psusi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.