linux tar -T - não funciona em tempo real

3

Eu encontrei algum problema com o linux gnu tar. wheh eu uso opção

-T -  (for file list from stdin) or
-T named_pipe_file    ,

isso não funciona na mosca. por exemplo, script interativo simples:

while read x; do echo $x; done|\
tar cvf tar.tar -T -

tar inicia o arquivamento somente quando pressiono ^ D para marcar entrada EOF a mesma situação é quando eu uso pipe nomeado:

mkfifo named_pipe
tar cvf tar.tar -T named_pipe
while read x; do echo $x; done >named_pipe

Parece que o alcatrão faz algum buffer. Mas quanto tempo é isso? Tenho que reempacotar muitos arquivos no TAR, mas tenho pouco espaço em disco. Então eu devo fazer isso na mosca. Eu uso a opção tar --remove-arquivos para isso. Mas sem interatividade para a opção -T é impossível. No plano, parte do código "while" deve descompactar o arquivo para o arquivo sequencialmente e aguardar o TAR para remover e o próximo arquivo. Obrigado por ideias:)

minha versão do tar: tar (tar GNU) 1.26 (C) 2011 FSF

    
por Znik 04.09.2013 / 14:28

3 respostas

3

tar é capaz de anexar arquivos já existentes, então você pode fazer:

touch tarfile.tar
command_that_produces_file_list | xargs tar rf tarfile.tar

Infelizmente, isso não funciona com a compactação imediata. Felizmente, o formato tar é simples o suficiente, podemos fazer alguns hackers:

command_that_produces_file_list | {
  xargs -i sh -c 'tar c {} | head -c $(( ('stat --printf="%s" {}' + 511) / 512 * 512 + 512))';
  dd if=/dev/zero bs=512 count=2 2>/dev/null;
} | compression_utility

tar output consiste em, para cada arquivo, um cabeçalho de 512 bytes seguido por blocos de 512 bytes suficientes para conter os dados do arquivo. Em seguida, anexa pelo menos 2 blocos de 512 bytes de zeros. O que esse código faz é capturar a saída do tar e remover os blocos extras de zeros, combinar a saída das várias invocações de tar juntos e, em seguida, fixar os blocos de zeros de finalização. A saída é enviada pelo pipe para o utilitário de compactação, que é executado simultaneamente com o tar s.

    
por 04.09.2013 / 15:17
2

Boas notícias. Eu recebo resposta para o meu relatório de bug para [email protected], cite:

From: Sergey Poznyakoff date:
Thu, 05 Sep 2013 08:40:40 +0300 subject: Re: [Bug-tar] gnu tar, option -T from stdin or named pipe is not interactive

Hi Grzegorz,

This has been fixed in the git HEAD (starting from commit 1fe0c83d).

Regards, Sergey

Então estou esperando quando isso será corrigido nas distribuições linux:)

    
por 05.09.2013 / 09:54
0

Leia esta explicação (primeira resposta): Em que ordem são canalizados? comandos são executados?

O que você vê é o bloqueio de tar para a conclusão da lista de entrada antes de iniciar o processamento. Indiscutivelmente, fazendo o processamento em paralelo com a entrada, um por um poderia ser útil, mas eu não acho que o GNU Tar suporta isso.

Eu só posso imaginar que esperar por toda a lista é feito para evitar a complexidade nos "procedimentos internos" de manipulação de argumentos de linha de comando - como como lidar com "--append e - remover arquivos ". Eu acho que a maioria das pessoas prefere remover todos os arquivos em massa após o arquivo ser concluído, e não em tempo como é desejável neste caso.

As pessoas do GNU são geralmente muito amigáveis, você poderia perguntar por que isso não é um recurso, como você pode fazer isso com outras ferramentas e até solicitar que isso faça parte do Tar no futuro;

link

    
por 04.09.2013 / 18:41

Tags