2016-01-22 20 views
5

Tôi có một chương trình ghi nhật ký đầu ra của nó vào tệp * .out khi chạy. Tôi thiết lập một kịch bản bash để chạy nhiều lần khác nhau, do đó, mỗi lần chạy ghi vào một tệp * .out khác. Tôi thấy rằng tôi có thể tail các file * .out gần đây nhất như thế này:Đuôi tệp mới nhất

watch tail $(ls -tr *.out | tail -n1) 

Vấn đề có vẻ là rằng tham khảo $() chỉ được thực hiện một lần. Vì vậy, khi lần chạy đầu tiên kết thúc, watch tiếp tục đến tail cùng một tệp * .out, mặc dù hiện có tệp * .out mới hơn.

Làm cách nào tôi có thể thay đổi điều này để chuyển đến tệp * .out tiếp theo sau khi một lần chạy kết thúc?

Tôi đã thử thực hiện một số lồng dấu ngoặc kép và dấu ngoặc đơn, nhưng tôi thực sự không hiểu chi tiết tham chiếu. Các vấn đề phức tạp bởi thực tế là watch chuyển lệnh của nó tới sh, mặc dù tôi đang sử dụng bash.

Điểm thưởng: sẽ rất tuyệt nếu điều này có thể được sửa đổi thành tail -f thay vì chỉ lặp lại watch mỗi n giây.

+2

hm..Tôi thực sự không hiểu trường hợp sử dụng. Bạn có muốn đọc một vài tệp trong thời gian thực không? nếu có, nó dễ sử dụng hơn 'đuôi -f * .out' – pivanchy

+0

Tôi thường đồng ý với @pivanchy, mặc dù đáng nói đến là phần đuôi' POS' không được đảm bảo để xử lý nhiều hơn một tệp tại một thời điểm. – kojiro

+0

@pivanchy đó là giải pháp. Tôi không nhận ra điều đó thật đơn giản. –

Trả lời

2

Tôi cũng giải quyết vấn đề này và cuối cùng đã đến giải pháp này:

watch "ls -t1 | sed q | xargs tail" 

Cần để có được một chút hacky cho tiền thưởng. Lệnh tail cũng hỗ trợ đối số --pid làm cho tail chết ngay khi PID được tham chiếu chết. Nghe hay sao? Dưới đây là một số mẫu mà bạn có thể sử dụng:

while true; do ls -t1 | sed q | xargs lsof -F np | sed 's/.\(.*\)/\1/g' | xargs tail -f --pid 2>/dev/null ; done 

Điều này về cơ bản theo dõi tệp mới nhất và khởi động lại tail khi quá trình ghi tệp kết thúc.

+0

Cảm ơn! Tôi chỉ cần thêm một bộ lọc tập tin đơn giản như thế này: 'xem ls -t1 * .out | sed q | xargs tail "' –

+1

@JeffIrwin Cũng thử chỉnh sửa. Nó không xem tập tin nữa, nhưng sau đầu ra trực tiếp (với đuôi). – steffen

+1

Công việc chỉnh sửa tuyệt vời! Tôi thậm chí không cố gắng hiểu tất cả các đường ống. –

1

Vì vậy, tôi sẽ lặp lại một ít câu trả lời hiện tại của tôi: Tail the most recent file

bạn có thể sử dụng lệnh rất đơn giản để giải quyết vấn đề của bạn:

tail -f *.out 

đuôi làm việc với một nhiều file quá và nó có thể để sử dụng nó như:

tail -f file1 file2 file3 

Vì vậy, bạn có thể thấy, công cụ rất mạnh mẽ và dễ dàng và bạn không cần phải chơi với lệnh linux s

1

Nếu tất cả các tập tin tồn tại để bắt đầu với, và bạn có một thực hiện hiện đại của tail có thể xử lý nhiều file,

tail -f *.out 

sẽ dường như là giải pháp tốt nhất. Nhưng nếu bạn không có tất cả các tệp để bắt đầu, thì nó sẽ vẫn dễ dàng nhất nếu bạn vừa tạo chúng. *.out sẽ chỉ mở rộng các tệp bạn đã có.

Nhưng nếu bạn không thể biết tên tệp cho tail -f trước khi bắt đầu, thì bạn sẽ cần phải khởi động lại đuôi nếu có bất kỳ tệp outfiles mới nào được tạo trong khi bạn đang tailing.Trong trường hợp đó, do bạn chỉ bằng văn bản cho mỗi outfile cùng một lúc, bạn có thể làm:

inotifywait -m -e create -q . | while read dir event file; do 
    kill %tail 
    tail -f "$file" & 
done 
kill %tail 

(Trên đây đòi hỏi inotifywait, được bao gồm trong inotify-tools trên hệ thống Debian-based như Ubuntu.) Nó đồng hồ thư mục hiện tại cho các tệp mới được tạo, đuôi bất kỳ tệp nào được tạo, trong nền và giết lệnh đuôi trước đó bất cứ khi nào tệp mới được tạo.

Các vấn đề liên quan