¿Cómo "gato y sigo" un archivo?

31

Un archivo está siendo descargado secuencialmente por wget.

Si empiezo a descomprimirlo cat myfile.tar.bz2 | tar -xj, puede descomprimirlo correctamente o puede fallar con "EOF inesperado", dependiendo de lo que sea más rápido.

Cómo "catear y seguir" un archivo, es decir, enviar el contenido del archivo a stdout, pero no salir en EOF, en cambio, mantenerse suscrito a ese archivo y continuar enviando nuevas porciones de datos, saliendo solo si el archivo está cerrado por escritor y no se vuelve a abrir en N segundos.


He creado un script cat_and_follow basado en la respuesta de @ arielCo que también termina tailcuando el archivo ya no se abre para escribir.

Vi.
fuente
2
Creo que está buscando el tailcomando con su opción de seguimiento.
keshlam
tailfunciona con archivos binarios también?
Vi.
2
También te puede less +F
interesar
Sé que encontraste tu solución, pero tengo una pregunta, ¿por qué no simplemente:wget ... && tar xjvf ...
Joseph R.
@JosephR., 1. Para ahorrar tiempo paralelizando; 2. Para igualar la carga del sistema (evitando / minimizando la fase de desempaque de aceleración total que requiere muchos recursos); 3. Para evitar recordar el comando "desempaquetar" más tarde (o programarlo) o escribir el comando encadenado en primer lugar (cuando aún no estoy seguro de querer desempaquetarlo).
Vi.

Respuestas:

22
tail +1f file

Lo probé en Ubuntu con el tarball fuente de LibreOffice mientras wgetlo descargaba:

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

También funciona en Solaris 10, RHEL3, AIX 5 y Busybox 1.22.1 en mi teléfono Android (uso tail +1 -f filecon Busybox).

arielCo
fuente
1
¿Saldrá automáticamente cuando finalice la descarga? Espero que el "seguidor" escanee /proc/*/fd/periódicamente y verifique si el archivo está cerrado definitivamente.
Vi.
2
No esperaba que tailfuncionara con archivos binray ...
Vi.
Creó un script que escanea /proc/../fd y termina automáticamente.
Vi.
1
No necesita GNU tail, creo que la -fopción es estándar. Sin embargo, no terminará automáticamente cuando finalice la descarga.
Barmar
44
En Ubuntu tail +1fno funciona. Tienes que hacertail -n +1
dangonfast
11

El problema es que catno es consciente de que el archivo todavía se está agregando. Tan pronto como catencuentra el final (actual) del archivo, sale.

Tienes que hacer que wgetescribir a una tubería (o FIFO) con el fin de evitar esto.

wget -O - http://... | tar -xjf -
Hauke ​​Laging
fuente
77
O curl, que sale a stdout por defecto. Y (1) -f -es redundante, tarlee de forma estándar stdin, y (2) la mayoría de los tars pueden detectar la compresión automáticamente, por lo jque a menudo es innecesario. curl http://... | tar x
Kevin
2
Esto se descargará sin guardar el archivo desempaquetado. También obstaculizará la continuación de la descarga en caso de mala red.
Vi.
3
@Vi. Puede guardar el archivo de teeesta manera: curl http://… | tee ….tbz | tar -xjpero reanudar la descarga se vuelve más complicado que simplemente invocar el mismo comando nuevamente.
kasperd
5

Para leer y seguir un archivo desde el principio hasta que se interrumpa:

tail -fn +1 file

Para demostrarlo, intente esto (suponiendo 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: lo +1fmencionado por otros se interpreta como un nombre de archivo, al menos en el tailcomando GNU ).

Lo anterior funciona para un solo archivo. La concatenación de múltiples archivos no podría seguirlos a todos de manera determinista, sin colgarse del primero. Para ' cat and follow ', siguiendo solo el último archivo, se puede usar la sustitución del proceso . Aquí hay otra demostración:

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
fuente
Esto funcionó para mí mientras tail +1f fileno lo hizo.
therealfarfetchd
Esta respuesta es mucho mejor que tail +1fcuando se combina con otras opciones como--pid
Joseph K. Strauss