ฉันจะ“ แมวและติดตาม” ไฟล์ได้อย่างไร


31

wgetไฟล์จะถูกดาวน์โหลดตามลำดับโดย

หากฉันเริ่มเปิดออกด้วยcat myfile.tar.bz2 | tar -xjอาจเป็นแกะอย่างถูกต้องหรือล้มเหลวด้วย "ไม่คาดคิด EOF" ขึ้นอยู่กับสิ่งที่เร็วขึ้น

วิธี "cat และ follow" ไฟล์เช่นเนื้อหาที่ส่งออกของไฟล์ไปยัง stdout แต่ไม่ออกจาก EOF ให้หม่อม subribed ไปที่ไฟล์นั้นและทำการส่งออกส่วนใหม่ของข้อมูลออกต่อเมื่อปิดไฟล์โดย ผู้เขียนและไม่เปิดใหม่ภายใน N วินาที


ฉันได้สร้างสคริปต์cat_and_followตามคำตอบของ @ arielCo ซึ่งจะยุติtailเมื่อไฟล์ไม่ถูกเปิดเพื่อการเขียนอีกต่อไป


2
ฉันคิดว่าคุณกำลังมองหาtailคำสั่งด้วยตัวเลือกการติดตาม
keshlam

tailทำงานกับไฟล์ไบนารีได้หรือไม่
วิ

2
คุณอาจชอบless +F...
mikeserv

ฉันรู้ว่าคุณพบวิธีแก้ปัญหาของคุณแล้ว แต่ฉันมีคำถามทำไมไม่ทำอย่างนั้น:wget ... && tar xjvf ...
โจเซฟอาร์

@JosephR., 1. เพื่อประหยัดเวลาโดยการขนาน 2. เพื่อเพิ่มภาระให้กับระบบ 3. เพื่อหลีกเลี่ยงการจดจำเกี่ยวกับคำสั่ง "unpack" ในภายหลัง (หรือกำหนดเวลา) หรือพิมพ์คำสั่งที่ถูกโยงไว้ในตำแหน่งแรก (เมื่อฉันยังไม่แน่ใจว่าฉันต้องการแตกออก)
วิ

คำตอบ:


22
tail +1f file

ฉันทดสอบบน Ubuntu ด้วย tarball แหล่ง LibreOffice ในขณะที่wgetดาวน์โหลด:

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

มันยังทำงานบน Solaris 10, RHEL3, AIX 5 และ Busybox 1.22.1 ในโทรศัพท์ Android ของฉัน (ใช้tail +1 -f fileกับ Busybox)


1
มันจะออกโดยอัตโนมัติเมื่อการดาวน์โหลดเสร็จสิ้นหรือไม่ ฉันคาดว่า "ผู้ติดตาม" จะสแกน/proc/*/fd/เป็นระยะและตรวจสอบว่าไฟล์ถูกปิดหรือไม่
วิ

2
ฉันไม่ได้คาดหวังว่ามันจะtailทำงานกับไฟล์ binray ...
Vi

สร้างสคริปต์ที่สแกน /proc/../fd และยกเลิกอัตโนมัติ
วิ

1
คุณไม่ต้องการหาง GNU ฉันเชื่อว่า-fตัวเลือกนั้นเป็นมาตรฐาน อย่างไรก็ตามจะไม่สิ้นสุดโดยอัตโนมัติเมื่อการดาวน์โหลดเสร็จสิ้น
Barmar

4
ใน Ubuntu tail +1fไม่ทำงาน คุณต้องทำtail -n +1
dangonfast

11

ปัญหาคือcatไม่ทราบว่าไฟล์ยังคงถูกต่อท้าย ทันทีที่catพบจุดสิ้นสุด (ปัจจุบัน) ของไฟล์ที่ออก

คุณต้องwgetเขียนไปที่ไพพ์ (หรือ FIFO) เพื่อหลีกเลี่ยงปัญหานี้

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

7
หรือcurlซึ่งส่งออกไปยัง stdout โดยค่าเริ่มต้น และ (1) -f -ซ้ำซ้อนtarอ่านจาก stdin เป็นค่าเริ่มต้นและ (2) ส่วนใหญ่tarสามารถตรวจจับการบีบอัดโดยอัตโนมัติดังนั้นจึงjมักไม่จำเป็น curl http://... | tar x
เควิน

2
สิ่งนี้จะดาวน์โหลดโดยไม่บันทึกไฟล์ที่คลายการแพค มันจะขัดขวางการดาวน์โหลดอย่างต่อเนื่องในกรณีที่เครือข่ายไม่ดี
วิ

3
@Vi คุณสามารถบันทึกไฟล์โดยใช้teeสิ่งนี้: curl http://… | tee ….tbz | tar -xjแต่การกลับมาดาวน์โหลดจะมีความซับซ้อนมากกว่าเพียงแค่เรียกใช้คำสั่งเดิมอีกครั้ง
kasperd

5

หากต้องการอ่านและติดตามไฟล์ตั้งแต่ต้นจนถึงขัดจังหวะ:

tail -fn +1 file

เพื่อแสดงให้เห็นว่าลองสิ่งนี้ (สมมติว่า Bash กับ 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.

(หมายเหตุ: +1fคนอื่น ๆ ที่กล่าวถึงถูกตีความว่าเป็นชื่อไฟล์อย่างน้อยในtailคำสั่งGNU )

ด้านบนใช้ได้กับไฟล์เดียว การต่อไฟล์หลาย ๆ ไฟล์เข้าด้วยกันจะไม่สามารถติดตามได้ทั้งหมดโดยไม่ถูกกำหนด หากต้องการ ' cat and follow ' ตามด้วยไฟล์สุดท้ายเท่านั้นสามารถใช้การทดแทนกระบวนการได้ นี่เป็นอีกการสาธิต:

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.

สิ่งนี้ใช้ได้สำหรับฉันในขณะที่tail +1f fileไม่ได้
กำหนด

คำตอบนี้ดีกว่าtail +1fเมื่อรวมกับตัวเลือกอื่น ๆ เช่น--pid
Joseph K. Strauss
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.