Bagaimana cara saya "cat dan ikuti" file?

31

File sedang diunduh secara berurutan oleh wget.

Jika saya mulai membongkar dengan cat myfile.tar.bz2 | tar -xj, itu mungkin membongkar dengan benar atau gagal dengan "EOF Tidak Terduga", tergantung pada apa yang lebih cepat.

Cara "mengecat dan mengikuti" file, yaitu konten output file ke stdout, tetapi jangan keluar di EOF, alih-alih tetap berlangganan file itu dan terus mengeluarkan bagian data baru, keluar hanya jika file ditutup oleh penulis dan tidak dibuka kembali dalam N detik.


Saya telah membuat skrip cat_and_follow berdasarkan jawaban @ arielCo yang juga mengakhiri tailkapan file tidak lagi dibuka untuk ditulis.

Vi.
sumber
2
Saya pikir Anda sedang mencari tailperintah dengan opsi ikuti.
keshlam
tailbekerja dengan file biner juga?
Vi.
2
Anda mungkin juga menyukai less +F...
mikeserv
Saya tahu Anda menemukan solusi Anda, tetapi saya punya pertanyaan, mengapa tidak melakukannya:wget ... && tar xjvf ...
Joseph R.
@ JosephR., 1. Untuk menghemat waktu dengan memparalelkan; 2. Untuk meratakan beban sistem (menghindari / meminimalkan fase pembongkaran throttle penuh intensif sumber daya); 3. Untuk menghindari mengingat tentang perintah "unpack" nanti (atau menjadwalkannya) atau mengetikkan perintah chained di tempat pertama (ketika saya belum yakin bahwa saya ingin membongkar itu).
Vi.

Jawaban:

22
tail +1f file

Saya mengujinya di Ubuntu dengan tarball sumber LibreOffice saat wgetmengunduhnya:

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

Ini juga berfungsi pada Solaris 10, RHEL3, AIX 5 dan Busybox 1.22.1 di ponsel Android saya (digunakan tail +1 -f filedengan Busybox).

arielCo
sumber
1
Apakah akan keluar secara otomatis saat pengunduhan selesai? Saya berharap "pengikut" untuk memindai /proc/*/fd/secara berkala dan memeriksa apakah file ditutup untuk selamanya.
Vi.
2
Saya tidak berharap itu tailbekerja dengan file binray ...
Vi.
Membuat skrip yang memindai /proc/../fd dan penghentian otomatis.
Vi.
1
Anda tidak perlu ekor GNU, saya yakin -fpilihannya standar. Namun, itu tidak akan berakhir secara otomatis ketika unduhan selesai.
Barmar
4
Di Ubuntu tail +1ftidak bekerja. Anda harus melakukannyatail -n +1
dangonfast
11

Masalahnya adalah bahwa cattidak menyadari bahwa file tersebut masih ditambahkan. Segera setelah catmenemukan ujung (saat ini) dari file itu keluar.

Anda harus wgetmenulis ke pipa (atau FIFO) untuk menghindari hal ini.

wget -O - http://... | tar -xjf -
Hauke ​​Laging
sumber
7
Atau curl, yang output ke stdout secara default. Dan (1) -f -redundan, tardibaca dari stdin secara default, dan (2) kebanyakan tars dapat mendeteksi kompresi secara otomatis, sehingga jseringkali tidak diperlukan. curl http://... | tar x
Kevin
2
Ini akan mengunduh tanpa menyimpan file yang belum dibuka. Juga akan menghambat melanjutkan pengunduhan jika jaringannya buruk.
Vi.
3
@ Vi. Anda dapat menyimpan file dengan menggunakan teeseperti ini curl http://… | tee ….tbz | tar -xj:, tetapi melanjutkan unduhan menjadi lebih rumit daripada hanya menjalankan perintah yang sama lagi.
kasperd
5

Untuk membaca dan mengikuti file dari awal hingga terputus:

tail -fn +1 file

Untuk menunjukkan itu, coba ini (dengan asumsi Bash dengan 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.

(Catatan: Yang +1fdisebutkan oleh orang lain ditafsirkan sebagai nama file, setidaknya dalam tailperintah GNU .)

Di atas berfungsi untuk satu file. Penggabungan beberapa file tidak akan dapat mengikuti semuanya secara deterministik, tanpa bergantung pada yang pertama. Untuk ' mengikuti dan mengikuti ', hanya dengan mengikuti file terakhir, seseorang dapat menggunakan subtitusi proses . Ini demonstrasi lain:

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
sumber
Ini bekerja untuk saya sementara tail +1f filetidak.
therealfarfetchd
Jawaban ini jauh lebih baik daripada tail +1fketika menggabungkannya dengan opsi lain seperti--pid
Joseph K. Strauss