Como colocar arquivos tar com uma ordem classificada?

7

Se você tar um diretório recursivamente, ele apenas usa a ordem do readdir do sistema operacional.

Mas, em alguns casos, é bom colocar os arquivos em ordem.

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

Note que, para o propósito desta questão, o gnu-tar em um sistema Linux típico é bom.

    
por ideasman42 08.01.2015 / 13:11

3 respostas

15

Para um% GNUtar:

--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 ver --preserve-order .

    
por 08.01.2015 / 14:41
3

Com zsh , em vez de:

pax -w dir

Uso:

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

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

pax -dw dir/**

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

pax -dw dir dir/**

pax é o comando padrão para criar arquivos tar . A saída vai para stdout. Shell globs são classificados por nome.

Se você encontrar um erro lista Arg por muito tempo , poderá alterar para:

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

(nem todas as pax implementações suportam -0 ).

    
por 08.01.2015 / 15:17
1

tar em si não pode fazer isso, então você tem que criá-lo a partir de uma lista ordenada corretamente. Em princípio, você poderia então usar a opção tar do -T , mas não há como especificar que os nomes de arquivos nessa lista devem ser terminados pelo NUL. Então, se você tem algum nome de arquivo com newlines neles (o que é permitido), isso irá quebrar.

A melhor opção é usar cpio para gerar os arquivos, pois isso aceita uma lista terminada de NU de nomes de arquivos e pode gerar arquivos tar.

Se o seu comando tar for:

tar cvf /somedir/all.tar .

Em seguida, para que isso seja classificado pelo nome que você teria que fazer (assumindo o GNU find e o cpio):

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

Isso tem a desvantagem de os subdiretórios serem colocados entre nomes de arquivos. Você pode fazer truques com find s -printf0 especificando o diretório e as informações de profundidade e classificação com sort -n , mas isso também influencia como os arquivos com números são classificados em um diretório.

Se o acima não for satisfatório você provavelmente poderia usar um pequeno programa python baseado em os.walk() para gerar a ordenação desejada com controle total (profundidade primeiro, baseada na extensão etc), mas se você seguir essa rota você pode bem, solte cpio e escreva o arquivo tar com o módulo tarfile do python.

    
por 08.01.2015 / 14:01

Tags