Làm thế nào để tôi đá mèo và theo dõi một tập tin?


31

Một tập tin đang được tải xuống tuần tự bởi wget.

Nếu tôi bắt đầu giải nén nó cat myfile.tar.bz2 | tar -xj, nó có thể giải nén chính xác hoặc thất bại với "EOF bất ngờ", tùy thuộc vào cái gì nhanh hơn.

Cách "cat and follow" một tệp, tức là xuất nội dung của tệp thành thiết bị xuất chuẩn, nhưng không thoát khỏi EOF, thay vào đó, hãy giữ lại cho tệp đó và tiếp tục xuất ra các phần mới của dữ liệu, chỉ thoát khi tệp bị đóng nhà văn và không được mở lại trong vòng N giây.


Tôi đã tạo một tập lệnh cat_and_follow dựa trên câu trả lời của @ arielCo, nó cũng chấm dứt tailkhi tập tin không được mở để viết nữa.


2
Tôi nghĩ rằng bạn đang tìm kiếm taillệnh với tùy chọn theo dõi của nó.
keshlam

taillàm việc với các tập tin nhị phân là tốt?
Vi.

2
Bạn cũng có thể thích less +F...
mikeerv

Tôi biết bạn đã tìm thấy giải pháp của mình, nhưng tôi có một câu hỏi, tại sao không đơn giản làm:wget ... && tar xjvf ...
Joseph R.

@JosephR., 1. Để tiết kiệm thời gian bằng cách song song; 2. Để thậm chí tăng tải hệ thống (tránh / giảm thiểu giai đoạn giải nén toàn bộ tiết lưu tài nguyên); 3. Để tránh nhớ về lệnh "giải nén" sau (hoặc lên lịch cho nó) hoặc gõ lệnh xích ở vị trí đầu tiên (khi tôi chưa chắc chắn rằng tôi muốn giải nén nó).
Vi.

Câu trả lời:


22
tail +1f file

Tôi đã thử nghiệm nó trên Ubuntu với tarball nguồn LibreScript trong khi wgetđang tải xuống:

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

Nó cũng hoạt động trên Solaris 10, RHEL3, AIX 5 và Busybox 1.22.1 trong điện thoại Android của tôi (sử dụng tail +1 -f filevới Busybox).


1
Nó sẽ tự động thoát khi tải xuống xong? Tôi hy vọng rằng "người theo dõi" sẽ quét /proc/*/fd/định kỳ và kiểm tra xem tập tin đã được đóng chưa.
Vi.

2
Tôi không mong đợi nó tailhoạt động với các tập tin binray ...
Vi.

Tạo một tập lệnh quét /proc/../fd và tự động chấm dứt.
Vi.

1
Bạn không cần đuôi GNU, tôi tin rằng -ftùy chọn này là tiêu chuẩn. Tuy nhiên, nó sẽ không tự động chấm dứt khi quá trình tải xuống kết thúc.
Barmar

4
Trong Ubuntu tail +1fkhông hoạt động. Bạn phải làmtail -n +1
dangonfast

11

Vấn đề là catkhông biết rằng tập tin vẫn đang được nối thêm. Ngay khi catgặp phần cuối (hiện tại) của tệp, nó sẽ thoát.

Bạn phải wgetviết thư cho một đường ống (hoặc FIFO) để tránh điều này.

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

7
Hoặc curl, mà đầu ra thành thiết bị xuất chuẩn theo mặc định. Và (1) -f -là dự phòng, tarđọc từ stdin theo mặc định và (2) hầu hết tars có thể tự động phát hiện việc nén, do đó jthường không cần thiết. curl http://... | tar x
Kevin

2
Điều này sẽ tải xuống mà không lưu tập tin giải nén. Ngoài ra, nó sẽ cản trở việc tiếp tục tải xuống trong trường hợp mạng xấu.
Vi.

3
@Vi. Bạn có thể lưu tệp bằng cách sử dụng teenhư thế này: curl http://… | tee ….tbz | tar -xjnhưng việc tiếp tục tải xuống trở nên phức tạp hơn là chỉ gọi lại cùng một lệnh.
kasperd

5

Để đọc và theo dõi một tệp từ đầu cho đến khi bị gián đoạn:

tail -fn +1 file

Để chứng minh điều đó, hãy thử điều này (giả sử Bash với 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.

(Lưu ý: Những +1fngười khác được đề cập được hiểu là tên tệp, ít nhất là trong taillệnh GNU .)

Các công việc trên cho một tập tin duy nhất. Ghép nối nhiều tệp sẽ không thể theo dõi tất cả chúng một cách xác định, mà không treo trên đầu tiên. Để ' cat and follow ', chỉ theo tệp cuối cùng, người ta có thể sử dụng thay thế quy trình . Đây là một minh chứng khác:

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.

Điều này làm việc cho tôi trong khi tail +1f filekhông.
trị liệu

Câu trả lời này tốt hơn nhiều so với tail +1fkhi kết hợp nó với các tùy chọn khác như--pid
Joseph K. Strauss
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.