Como eu crio um arquivo tar em ordem alfabética?

19

Eu quero criar um arquivo tar onde todos os diretórios e arquivos são processados em ordem alfabética. Isso é para toda a hierarquia de diretórios que está sendo atingida, então ele começaria processando o primeiro diretório em ordem alfabética, e então subdiretaria lá alfabeticamente, etc. Eu examinei a página man e não consigo encontrar uma opção para isso.

Eu admito, isso é meia novidade, meio otimizada. Eu simplesmente não posso acreditar que não há uma maneira fácil de fazer isso. Eu devo estar perdendo alguma coisa.

    
por Erick Robertson 05.08.2010 / 15:54

5 respostas

9

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

--null

Você pode verificar o pedido no arquivo tar usando find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T - . Embora você provavelmente nunca precise das opções -print0, -z e --null, a menos que você saiba que encontrará um nome de arquivo com uma nova linha incorporada, nunca tentei fazê-lo.

    
por 06.12.2010 / 18:25
5

A ordem dos arquivos dentro do arquivo tar realmente não importa, desde quando os arquivos são extraídos, o sistema de arquivos não preservará a ordem de qualquer maneira.

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

% 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
    
por 05.08.2010 / 16:08
4

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

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

Se isso não funcionar (nunca tentei, então eu não sei de - 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.

    
por 06.08.2010 / 03:44
2
find . -depth -print0 | sort -z | pax -wvd0 > file.tar

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

    
por 23.06.2012 / 02:08
0

Como alternativa à resposta de @ CharlieHerron, se você estiver interessado apenas em preservar conteúdo (arquivos, symlink) e meta-dados da pasta (por exemplo, permissão de pasta, mtime, etc.), talvez queira filtrar pastas de% saída defind.

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
    
por 25.02.2015 / 11:25

Tags