Bir dosyayı nasıl “kediden izlerim”?


31

Bir dosya sırayla indiriliyor wget.

cat myfile.tar.bz2 | tar -xjPaketi açmaya başlarsam , daha hızlı olana bağlı olarak doğru şekilde açabilir veya "Beklenmeyen EOF" ile başarısız olabilir.

Bir dosyanın "yakalanması ve izlenmesi", yani dosyanın stdout'a çıkış içeriği, ancak EOF'den çıkılmaması, bunun yerine o dosyaya bağlı kalmak ve verinin yeni kısımlarını çıkarmaya devam etmek, sadece dosya kapalıysa yazar ve N saniye içinde yeniden açılmaz.


Bir senaryo oluşturduk cat_and_follow arielCo en @ dayanan cevap da sonlandırır taildosya artık yazmak için açılırken değilken.


2
Bence tailtakip seçeneği olan komutu arıyorsun .
keshlam

tailikili dosyalar ile de çalışır?
Vi.

2
Bunları da beğenebilirsin less +F...
mikeserv

Çözümünüzü bulduğunuzu biliyorum, ama bir sorum var, neden basitçe:wget ... && tar xjvf ...
Joseph R.

@JosephR., 1. Paralelleştirerek zamandan tasarruf etmek; 2. Sistem yükünü dengelemek (kaynak-yoğun tam gaz açma aşamasından kaçınılması / en aza indirilmesi); 3. Daha sonra "paketi aç" komutunu hatırlamaktan (veya zamanlamaktan) kaçınmaktan ya da ilk sırada zincirleme komutunu yazmaktan (henüz açmak istediğimden emin olmadığımda).
Vi.

Yanıtlar:


22
tail +1f file

İndirirken LibreOffice source tarball ile Ubuntu'da test wgetettim:

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

Ayrıca Android telefonumda Solaris 10, RHEL3, AIX 5 ve Busybox 1.22.1 tail +1 -f fileile çalışıyor (Busybox ile birlikte kullanın ).


1
İndirme işlemi bittiğinde otomatik olarak kapanacak mı? "Takipçi" nin /proc/*/fd/düzenli aralıklarla taramasını ve dosyanın kapalı olup olmadığını kontrol etmesini bekliyorum .
Vi.

2
Bunun tailbinray dosyaları ile çalışmasını beklemiyordum ...
Vi.

/Proc/../fd tarama ve otomatik sonlandırma yapan bir komut dosyası oluşturuldu.
Vi.

1
GNU kuyruğuna ihtiyacınız yok, -fseçeneğin standart olduğuna inanıyorum . Ancak indirme işlemi tamamlandığında otomatik olarak sonlandırılmaz.
Barmar

4
Ubuntu'da tail +1fçalışmıyor. Yapmanız gerekentail -n +1
dangonfast

11

Sorun şu ki catdosyanın hala eklenmekte olduğunun farkında değil. En kısa sürede catkarşılaşmalar Çıkan dosyanın (güncel) sonu.

Bunu wgetönlemek için bir boruya (veya FIFO) yazı yazmanız gerekir.

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

7
Veya curl, varsayılan olarak stdout çıktısı. Ve (1) -f -gereksizdir, tarvarsayılan olarak stdin'den okur ve (2) çoğu tars sıkıştırmayı otomatik olarak algılayabilir, bu nedenle jgenellikle gereksizdir. curl http://... | tar x
Kevin

2
Bu, açılmış dosyayı kaydetmeden indirecektir. Ayrıca, kötü ağ olması durumunda indirme işleminin devam etmesini engelleyecektir.
Vi.

3
@Vi. Dosyayı şu şekilde kullanarak kaydedebilirsiniz tee: curl http://… | tee ….tbz | tar -xjancak indirmeye devam etmek, aynı komutu tekrar başlatmaktan daha karmaşık hale gelir.
kasperd

5

To okuyup izleyin kesintiye kadar başından bir dosya:

tail -fn +1 file

Bunu göstermek için şunu deneyin (Bash'in GNU Coreutils ile varsayarak):

(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.

(Not: +1fBaşkaları tarafından belirtilenler, en azından GNU tailkomutunda dosya adı olarak yorumlanır .)

Yukarıdakiler tek bir dosya için çalışıyor. Birden fazla dosyanın birleştirilmesi, birincisine asılmaksızın hepsini belirleyici olarak izleyemezdi. ' Kediyi takip et ve takip etmek ' için, sadece son dosyayı izleyerek, süreç değiştirme işlemini kullanabilirsiniz . İşte başka bir gösteri:

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.

Bu tail +1f fileolmadı benim için çalıştı .
therealfarfetchd

Bu cevap, tail +1fdiğer seçeneklerle birleştiğinden çok daha iyidir--pid
Joseph K. Strauss
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.