Como tar arquivos com uma ordem classificada?

10

Se você é tarum diretório recursivamente, ele usa apenas a ordem dos SOs readdir.

Mas, em alguns casos, é bom classificar os arquivos classificados.

Qual é uma boa maneira de tar um diretório classificado em ordem alfabética?


Observe que, para os fins desta pergunta, o gnu-tar em um sistema Linux típico é bom.

ideasman42
fonte
possível duplicata abaixo, Confira abaixo os links unix.stackexchange.com/questions/120143/... superuser.com/questions/172367/...
Jaymin Dabhi
Eu vi isso, mas não estou perguntando como o pedido é definido. Em vez disso, quero classificá-los.
ideasman42
Consulte também unix.stackexchange.com/a/67018 para classificar uma árvore de diretórios por nome.
Stéphane Chazelas

Respostas:

17

Para um 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.

Você provavelmente também vai querer olhar --preserve-order.

mikeserv
fonte
8
--sortfoi introduzido na versão 1.28 do tar. --preserve-ordernão é relevante para esta questão.
mhsmith
Eu continuo tendo tar: Exiting with failure status due to previous errorserro. @mhsmith
alper 30/09/18
3

Com zsh, em vez de:

pax -w dir

Usar:

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

Você pode fazer o mesmo com versões recentes de bash -O globstar -O dotglobwith:

pax -dw dir/**

Ou versões recentes de FIGNORE='@(.|..)' ksh93 -o globstarwith:

pax -dw dir dir/**

paxé o comando padrão para criar tararquivos. A saída vai para stdout. Os globs do shell são classificados por nome.

Se você encontrar um erro muito longo da lista Arg , poderá mudar para:

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

( embora nem todas as paximplementações sejam compatíveis -0).

Stéphane Chazelas
fonte
2

tarele próprio não pode fazer isso, então você deve criá-lo a partir de uma lista ordenada corretamente. Em princípio, você poderia usar tara -Topção de, mas não há como especificar que os nomes de arquivos nessa lista sejam NUL terminados. Portanto, se você tiver algum nome de arquivo com novas linhas (o que é permitido), isso será interrompido.

Uma opção melhor é usar cpiopara gerar os arquivos, pois isso aceita uma lista de nomes de arquivos terminada em NUL e pode gerar arquivos tar.

Se seu tarcomando seria:

tar cvf /somedir/all.tar .

Então, para que isso seja classificado por nome, você teria que fazer (assumindo que GNU find e cpio):

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

Isso tem a desvantagem, embora os subdiretórios sejam colocados entre os nomes de arquivos. Você pode fazer truques com finds -printf0 especificando o diretório e informações detalhadas e classificando, sort -nmas isso também influencia a maneira como os arquivos com números são classificados em um diretório.

Se o acima exposto não for satisfatório, você provavelmente poderá usar um pequeno programa python baseado em os.walk()para gerar a ordem que deseja com controle total (profundidade primeiro, com base na extensão etc.), mas se você seguir esse caminho, poderá também soltar cpioe escrever o tararquivo com o tarfilemódulo python .

Anthon
fonte
1
--null especifica que -T pega seqüências terminadas nulas.
Psusi