Como crio um arquivo tar em ordem alfabética?


22

Quero criar um arquivo tar em que todos os diretórios e arquivos sejam processados ​​em ordem alfabética. Isso é para toda a hierarquia de diretórios que está sendo tarada, então começaria processando o primeiro diretório em ordem alfabética e, em seguida, subdiretórios lá em ordem alfabética, etc.

Admito, isso é meia novidade, meio leve otimização. Eu simplesmente não posso acreditar que não há uma maneira fácil de fazer isso. Eu devo estar esquecendo alguma coisa.


2
Por que você quer fazer isso?
Matthias Krull

Principalmente, é porque eu quero saber o quão perto a operação tar está sendo concluída. Quando os arquivos estão sendo carregados em ordem aleatória, não há como saber com o sinalizador -v.
Erick Robertson

2
Isso não é inteiramente verdade; Se você canalizar a saída para um arquivo e souber o número de arquivos (digamos um comando de localização rápida), poderá comparar a saída -v (wc -l) com o número de arquivos da localização para obter uma noção do progresso ...
Slartibartfast

2
@matthiaskrull Tenho uma razão não relacionada a isso, estou criando um arquivo OVA (que é um arquivo tar) para implantar VMs no VMWare ESX Server. O OVA precisa de arquivos em uma ordem específica dentro dele (o primeiro arquivo deve ser um OVF e assim por diante).
xask 16/09

1
Também há uma boa razão para isso: desempenho em um arquivo muito grande quando você deseja extrair apenas uma parte dele. Como a ordem é aleatória por padrão e você deseja extrair um arquivo / diretório, se for solicitado, será mais rápido, se não for, precisará verificar o arquivo inteiro antes de saber que ele terminou.
StormByte

Respostas:


12

Slartibartfast está no caminho certo, mas o comportamento padrão do tar é descer para diretórios, portanto, você pode obter mais de uma cópia do mesmo arquivo incluída no arquivo tar gerado. Você pode verificar fazendo tar tf file.tar | sort A solução alternativa é incluir a opção --no-recursion no tar. Além disso, você poderá enviar nomes de arquivos estranhos usando a -print0 opção para localizar e, em seguida, usando a --nullopção para tar. O resultado final é assim:

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

Você pode verificar a ordem no arquivo tar usando tar tsf tarfile.tar. Embora você provavelmente nunca precise das opções -print0, -z e --null, a menos que saiba que encontrará um nome de arquivo com uma nova linha incorporada, nunca tentei.


Excelente sugestão para usar a opção --no-recursion, obrigado.
Erik

Esta é a solução que funcionou para mim. Eu tenho um caso de uso diferente do que Erick e o Google me trouxe aqui. Estou coletando instantâneos ao longo do tempo do estado completo de um sistema remoto. Os dados são altamente redundantes. Classificar a entrada de alcatrão por tempo (os nomes dos arquivos têm um carimbo de data / hora) melhora o desempenho do compressor. Um teste rápido mostra uma melhora no fator 2 (lzma2). Além disso, não descompacto o arquivo morto em um sistema de arquivos, mas faço um processamento de fluxo sobre entradas tar. Um fluxo classificado faz uma saída de depuração muito melhor e tem outros benefícios na cadeia de processos. 1
Johannes

5

A ordem dos arquivos no arquivo tar realmente não importa, pois quando os arquivos são extraídos, o sistema de arquivos não preservará a ordem.

Não há opção para isso, mas se você realmente quisesse, poderia fornecer ao tar uma lista de nomes de arquivos em ordem classificada, e isso criaria o arquivo tar com a ordem que você fornecer.

% 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
ou apenas classifique a saída:tar tf tarfile | sort
Doug Harris

Eu tenho muitos arquivos (mais de 20.000) para especificá-los todos na linha de comando.
Erick Robertson

4
A ordem dos arquivos no arquivo tar importa se você precisar descompactar e exibir durante o download.
Erik

Depende do sistema de arquivos.
Thorbjørn Ravn Andersen

4

Supondo que você não tenha nenhum arquivo com novas linhas nos nomes:

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

Se isso não funcionar (nunca tentei, então não conheço - significa stdin para o argumento -T):

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

Depois, há a questão do porquê. Mas às vezes é mais fácil não perguntar.


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

Pax é uma espécie de sucessor do POSIX para cpio e tar e meio que funde os melhores aspectos de ambos. Ele grava arquivos tar (ustar) por padrão. Ele também oferece ampliação automática e solicitação de mídia e imprime um resumo quando terminar.


0

Como alternativa à resposta do @ CharlieHerron, se você estiver interessado apenas em preservar o conteúdo (arquivos, link simbólico) e metadados da pasta (por exemplo, permissão de pasta, mtime, etc.), convém filtrar as pastas da saída da findsaída.

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.