Por que recebo um final de arquivo inesperado no meu script ao usar o gzip?

1

Eu tenho uma dúvida com isso:

for i in ./*.gz
do
gunzip -c $i | head -8000 | gzip > $(basename $i)
done

Eu recebo um erro de "fim de arquivo inesperado" para o gzip, e não obtenho o 8000, apenas algumas dezenas de linhas. Eu verifiquei a integridade dos meus arquivos e eles estão bem. Curiosamente, se eu corro para arquivos individuais:

gunzip -c file1.gz | head -8000 | gzip > file1.gz

Eu obtenho o resultado esperado. Com esse script, posso obter as primeiras 8000 linhas de um arquivo compactado com linhas 10708712 e compactar novamente. O novo arquivo sobrescreve o arquivo original, mas tudo bem.

    
por zorbax 29.10.2014 / 20:41

1 resposta

4

Você deve gravar a saída em um arquivo temporário e renomear:

for i in ./*.gz 
do 
  gunzip -c "$i" | head -8000 | gzip > "$i.tmp"
  mv -f "$i.tmp" $(basename "$i") 
done

Que sua versão às vezes funciona é se você tiver gunzip de buffers suficientes durante a leitura.

    
por 29.10.2014 / 20:46