Como eu "giro e sigo" um arquivo?

31

Um arquivo está sendo baixado sequencialmente por wget.

Se eu começar a descompactá-lo cat myfile.tar.bz2 | tar -xj, ele pode descompactar corretamente ou falhar com "EOF inesperado", dependendo do que for mais rápido.

Como "capturar e seguir" um arquivo, ou seja, enviar o conteúdo do arquivo para stdout, mas não sair no EOF, mantenha-se inscrito nesse arquivo e continue produzindo novas partes dos dados, saindo apenas se o arquivo for fechado por escritor e não reaberto dentro de N segundos.


Eu criei um script cat_and_follow com base na resposta da @ arielCo que também encerra tailquando o arquivo não está mais sendo aberto para gravação.

Vi.
fonte
2
Eu acho que você está procurando o tailcomando com sua opção follow.
keshlam
tailfunciona com arquivos binários também?
Vi.
2
Talvez você também goste de less +F...
mikeserv
Eu sei que você encontrou sua solução, mas eu tenho uma pergunta, por que não simplesmente:wget ... && tar xjvf ...
Joseph R.
@ JosephphR., 1. Para economizar tempo paralelizando; 2. Para equilibrar a carga do sistema (evitando / minimizando a fase de desembalagem com aceleração total intensiva em recursos); 3. Para evitar lembrar o comando "desempacotar" posteriormente (ou agendá-lo) ou digitar o comando encadeado em primeiro lugar (quando ainda não tenho certeza de que quero descompactá-lo).
Vi.

Respostas:

22
tail +1f file

Eu testei no Ubuntu com o tarball de origem do LibreOffice enquanto wgetfazia o download:

tail +1f libreoffice-4.2.5.2.tar.xz | tar -tvJf -

Também funciona no Solaris 10, RHEL3, AIX 5 e Busybox 1.22.1 no meu telefone Android (use tail +1 -f filecom o Busybox).

arielCo
fonte
1
Ele sairá automaticamente quando o download terminar? Espero que o "seguidor" verifique /proc/*/fd/periodicamente e verifique se o arquivo está fechado definitivamente.
Vi.
2
Não esperava que tailfuncionasse com arquivos binray ...
Vi.
Criou um script que faz a varredura /proc/../fd e a finalização automática.
Vi.
1
Você não precisa do GNU tail, acredito que a -fopção seja padrão. No entanto, ele não será encerrado automaticamente quando o download for concluído.
Barmar
4
No Ubuntu tail +1fnão funciona. Você precisa fazertail -n +1
dangonfast
11

O problema é que catnão está ciente de que o arquivo ainda está sendo anexado. Assim que catencontrar o final (atual) do arquivo, ele será encerrado.

É necessário wgetgravar em um canal (ou FIFO) para evitar isso.

wget -O - http://... | tar -xjf -
Hauke ​​Laging
fonte
7
Ou curl, que gera para stdout por padrão. E (1) -f -é redundante, tarlê de stdin por padrão e (2) a maioria dos tars pode detectar a compactação automaticamente, portanto, jmuitas vezes é desnecessário. curl http://... | tar x
Kevin
2
Isso fará o download sem salvar o arquivo descompactado. Também dificultará a continuação do download em caso de má rede.
Vi.
3
@Vi. Você pode salvar o arquivo usando o teeseguinte curl http://… | tee ….tbz | tar -xj:, mas retomar o download fica mais complicado do que simplesmente chamar o mesmo comando novamente.
kasperd
5

Para ler e seguir um arquivo desde o início até a interrupção:

tail -fn +1 file

Para demonstrar isso, tente o seguinte (assumindo o Bash com o GNU Coreutils):

(while true; do printf . >> /tmp/file; sleep 1; done)&
tail -fn +1 /tmp/file  # (Ctrl-C to interrupt, of course, or otherwise kill it.)
kill %  # Kills the while-loop.

(Nota: O +1fmencionado por outros é interpretado como um nome de arquivo, pelo menos no tailcomando GNU .)

O acima funciona para um único arquivo. A concatenação de vários arquivos não seria capaz de seguir todos eles de forma determinística, sem esperar pelo primeiro. Para ' cat and follow ', seguindo apenas o último arquivo, pode-se usar a substituição de processo . Aqui está outra demonstração:

printf file1 > /tmp/file1; printf file2 > /tmp/file2
(while true; do printf . | tee -a /tmp/file{1,2} > /dev/null; sleep 1; done)&
cat /tmp/file1 <(tail -fn +1 /tmp/file2)  # (Interrupt or kill it.)
kill %  # Kills the while-loop.
James Haigh
fonte
Isso funcionou para mim enquanto tail +1f filenão funcionou.
Therealfarfetchd
Esta resposta é muito melhor do que tail +1fquando combinando-a com outras opções, como--pid
Joseph K. Strauss