Come posso "cat and follow" un file?


31

Un file viene scaricato in sequenza da wget.

Se comincio a decomprimerlo con cat myfile.tar.bz2 | tar -xj, potrebbe decomprimere correttamente o non riuscire con "EOF imprevisto", a seconda di ciò che è più veloce.

Come "catare e seguire" un file, ovvero output del contenuto del file su stdout, ma non uscire su EOF, invece mantenere l'abbonamento a quel file e continuare a inviare nuove porzioni di dati, uscendo solo se il file è chiuso da scrittore e non riaperto entro N secondi.


Ho creato uno script cat_and_follow basato sulla risposta di @ arielCo che termina anche tailquando il file non viene più aperto per la scrittura.


2
Penso che tu stia cercando il tailcomando con la sua opzione follow.
Keshlam,

tailfunziona anche con file binari?
Vi.

2
Potrebbe piacerti anche less +F...
Mikeserv,

So che hai trovato la tua soluzione, ma ho una domanda, perché non farlo semplicemente:wget ... && tar xjvf ...
Joseph R.

@JosephR., 1. Per risparmiare tempo parallelizzando; 2. Per uniformare il carico del sistema (evitando / minimizzando la fase di disimballaggio dell'acceleratore completo ad alta intensità di risorse); 3. Per evitare di ricordare in seguito il comando "scompatta" (o pianificarlo) o di digitare il comando incatenato in primo luogo (quando non sono ancora sicuro di voler decomprimerlo).
Vi.

Risposte:


22
tail +1f file

L'ho provato su Ubuntu con il tarball dei sorgenti di LibreOffice mentre lo scaricavo wget:

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

Funziona anche su Solaris 10, RHEL3, AIX 5 e Busybox 1.22.1 nel mio telefono Android (utilizzare tail +1 -f filecon Busybox).


1
Uscirà automaticamente al termine del download? Mi aspetto che "follower" esegua /proc/*/fd/periodicamente la scansione e controlli se il file è chiuso per sempre.
Vi.

2
Non mi aspettavo che tailfunzionasse con i file binray ...
Vi.

Creato uno script che esegue la scansione /proc/../fd e la terminazione automatica.
Vi.

1
Non hai bisogno della coda GNU, credo che l' -fopzione sia standard. Tuttavia, non terminerà automaticamente al termine del download.
Barmar,

4
In Ubuntu tail +1fnon funziona. Devi faretail -n +1
dangonfast il

11

Il problema è che catnon è a conoscenza del fatto che il file viene ancora aggiunto. Non appena catincontra la (corrente) fine del file che esce.

Devi evitare di wgetscrivere su una pipe (o FIFO) per evitarlo.

wget -O - http://... | tar -xjf -

7
Oppure curl, che viene emesso su stdout per impostazione predefinita. E (1) -f -è ridondante, tarlegge di default da stdin e (2) la maggior parte delle tars è in grado di rilevare automaticamente la compressione, quindi jspesso non è necessaria. curl http://... | tar x
Kevin,

2
Questo verrà scaricato senza salvare il file decompresso. Inoltre impedirà di continuare il download in caso di rete difettosa.
Vi.

3
@Vi. Puoi salvare il file usando in teequesto modo curl http://… | tee ….tbz | tar -xj:, ma riprendere il download diventa più complicato che invocare di nuovo lo stesso comando.
Kasperd,

5

Per leggere e seguire un file dall'inizio fino all'interruzione:

tail -fn +1 file

Per dimostrarlo, prova questo (supponendo Bash con 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: il +1fcitato da altri viene interpretato come un nome file, almeno nel tailcomando GNU .)

Quanto sopra funziona per un singolo file. La concatenazione di più file non sarebbe in grado di seguirli tutti in modo deterministico, senza appendere al primo. Per " cat and follow ", seguendo solo l'ultimo file, è possibile utilizzare la sostituzione del processo . Ecco un'altra dimostrazione:

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.

Questo ha funzionato per me mentre tail +1f fileno.
therealfarfetchd,

Questa risposta è molto meglio di tail +1fquando la combini con altre opzioni come--pid
Joseph K. Strauss,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.