Come faccio a creare un file tar in ordine alfabetico?


22

Voglio creare un file tar in cui tutte le directory e i file vengono elaborati in ordine alfabetico. Questo è per l'intera gerarchia di directory che viene tarata, quindi inizierebbe elaborando la prima directory in ordine alfabetico, e poi le sottodirectory in ordine alfabetico, ecc. Ho cercato attraverso la pagina man e non riesco a trovare un interruttore per questo.

Devo ammettere che questa è metà novità e metà leggera ottimizzazione. Non riesco proprio a credere che non ci sia un modo semplice per farlo. Mi manca qualcosa.


2
Perchè vuoi fare questo?
Matthias Krull,

Principalmente, è perché voglio sapere quanto è vicina l'operazione di completamento del tar. Quando i file vengono caricati in ordine casuale, non c'è modo di dirlo con il flag -v.
Erick Robertson,

2
Questo non è del tutto vero; Se si esegue il pipe dell'output in un file e si conosce il numero di file (ad esempio un comando di ricerca rapida), è possibile confrontare l'output -v (wc -l) con il numero di file da trovare per avere un'idea dei progressi ...
Slartibartfast,

2
@matthiaskrull Ho una ragione non correlata per questo, sto creando un file OVA (che è un file tar) per la distribuzione di VM su VMWare ESX Server. OVA ha bisogno di file in un ordine specifico al suo interno (il primo file dovrebbe essere un OVF e così via).
xask,

1
C'è anche un ottimo motivo per questo: prestazioni su un file molto grande quando si desidera estrarne solo una parte. Poiché il suo ordine è casuale per impostazione predefinita e si desidera estrarre un file / directory, se viene ordinato sarà più veloce, in caso contrario, dovrà eseguire la scansione dell'intero archivio prima di sapere che è terminato.
StormByte,

Risposte:


12

Slartibartfast è sulla buona strada, ma il comportamento predefinito di tar è di scendere nelle directory, quindi potresti ottenere più di una copia dello stesso file incluso nel file tar generato. Puoi verificare facendo tar tf file.tar | sort La soluzione è includere l'opzione --no-recursion in tar. Inoltre, dovresti essere in grado di inviare strani nomi di file usando l' -print0 opzione per trovare, quindi usando l' --nullopzione per tar. Il risultato finale è simile al seguente:

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

Puoi controllare l'ordine nel file tar usando tar tsf tarfile.tar. Anche se probabilmente non avrai mai bisogno delle opzioni -print0, -z e --null a meno che tu non sappia che incontrerai un nome file con una nuova riga incorporata in esso, non l'ho mai provato.


Eccellente suggerimento per l'utilizzo dell'opzione --no-recursion, grazie.
Erik,

Questa è la soluzione che ha funzionato per me. Ho un caso d'uso diverso da quello che Erick e Google mi hanno portato qui. Sto collezionando istantanee nel tempo dello stato completo di un sistema remoto. I dati sono estremamente ridondanti. L'ordinamento dell'input tar per tempo (i nomi dei file hanno un timestamp) migliora le prestazioni del compressore. Un test rapido mostra un miglioramento del fattore 2 (lzma2). Inoltre, non decomprimo l'archivio in un filesystem, ma eseguo un flusso che elabora le voci tar. Un flusso ordinato rende l'output di debug molto più piacevole e presenta altri vantaggi nella catena di processi. +1
Johannes,

5

L'ordine dei file all'interno del file tar non ha molta importanza, poiché quando i file vengono estratti, il filesystem non manterrà comunque l'ordine.

Non c'è alcun interruttore per questo, ma se lo volevi davvero, potresti fornire a tar un elenco di nomi di file in ordine ordinato, e creerebbe il file tar con l'ordine che gli hai dato.

% 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 semplicemente ordinare l'output:tar tf tarfile | sort
Doug Harris

Ho troppi file (oltre 20.000) per specificarli tutti sulla riga di comando.
Erick Robertson,

4
L'ordine dei file all'interno del file tar è importante se è necessario decomprimere e visualizzare durante il download.
Erik,

Dipende dal file system.
Thorbjørn Ravn Andersen,

4

Supponendo che non ci siano file con nuove righe nei nomi:

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

Se ciò non funziona (mai provato, quindi non lo so - significa stdin per l'argomento -T):

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

Quindi c'è la domanda sul perché. Ma a volte è più facile non chiedere.


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

Pax è una specie del successore POSIX di cpio e tar e in qualche modo fonde i migliori aspetti di entrambi. Scrive archivi tar (ustar) per impostazione predefinita. Inoltre esegue automaticamente lo spanning e la richiesta di supporti e stampa un riepilogo al termine.


0

In alternativa alla risposta di @ CharlieHerron, se sei interessato solo a preservare il contenuto (file, link simbolici) e i metadati della cartella (ad es. Permesso di cartella, mtime, ecc.), Potresti voler filtrare le cartelle finddall'output.

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
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.