2013-09-05 108 views
16

Tôi đang theo dõi các tệp mới được tạo trong một thư mục trong linux. Mỗi bây giờ và sau đó tôi phát hành một "ls -ltr" trong đó. Nhưng tôi ước có một chương trình/tập lệnh tự động in và chỉ có các mục mới nhất. Tôi đã làm một vòng lặp ngắn trong khi liệt kê nó, nhưng nó sẽ lặp lại các mục không phải là mới và nó sẽ giữ cho màn hình của tôi lăn lên khi không có tập tin mới. Tôi đã học được về "xem", mà hiển thị những gì tôi muốn và làm mới mỗi N giây, nhưng tôi không muốn có một giao diện ncurses, tôi đang tìm một cái gì đó giống như đuôi:ls liên tục giống như đuôi (danh sách tệp)

  • tục
  • chỉ hiển thị các công cụ mới
  • in tại nhà ga của tôi, vì vậy tôi có thể chạy nó ở chế độ nền và làm những việc khác và xem đầu ra tất cả bây giờ và sau đó nhận được trộn lẫn với bất cứ điều gì tôi đang làm: D

Tóm tắt : lấy đầu vào, so sánh với đầu vào trước đó, chỉ xuất ra những gì mới. Điều gì đó không giống như một công cụ kỳ quặc, tôi có thể thấy nó đang được sử dụng cho các tình huống khác, vì vậy tôi mong đợi nó đã tồn tại, nhưng tôi không thể tìm thấy bất cứ điều gì. Gợi ý?

+0

phân phối gì bạn có đang chạy? –

+2

có thể trùng lặp của [Cách liên tục theo dõi thư mục bằng lệnh dnotify/inotify] (http://stackoverflow.com/questions/7566569/how-to-continuosly-monitor-the-directory-using-dnotify-inotify-command) – sehe

+0

Tôi đang chạy bạc hà. Tôi đang nhìn vào 'inotify', tôi chưa bao giờ nghe nói về nó, đặt rõ ràng nó không làm những gì tôi muốn, chỉ có thể giúp tôi lập trình một kịch bản để làm điều đó. – msb

Trả lời

9

Nếu bạn có quyền truy cập vào inotifywait (có sẵn từ inotify-công cụ gói nếu bạn đang ở trên Debian/Ubuntu), bạn có thể viết một kịch bản như thế này:

#!/bin/bash 

WATCH=/tmp 

inotifywait -q -m -e create --format %f $WATCH | while read event 
do 
    ls -ltr $WATCH/$event 
done 

Đây là một one-liner thắng' t cung cấp cho bạn những thông tin tương tự mà ls có, nhưng nó sẽ in ra tên tập tin:

inotifywait -q -m -e create --format %w%f /some/directory 
+0

Cảm ơn, điều đó đã hiệu quả. Tôi đã làm cho nó một kịch bản và tôi nhận được $ WATCH như một tham số. Cảm ơn! – msb

+0

Giống như một chú thích bổ sung, tập lệnh liệt kê tất cả các tệp mới nhưng tệp được thường là số không, và đó là vì ls được thực hiện sau khi tệp được tạo nhưng trước khi nội dung của nó được thêm vào. Tôi đã thêm một giấc ngủ trước khi ls và bây giờ tất cả là hoàn hảo. :-) Bạn có thể (hoặc tôi) thêm điều đó vào câu trả lời của bạn không? – msb

+2

Việc thay đổi '-e create' thành' -e close_write' có khắc phục được điều đó không? –

29

bạn có thể sử dụng lệnh rất tiện dụng watch

watch -n 10 "ls -ltr" 

Và bạn sẽ nhận được ls cứ sau 10 giây.

Và nếu bạn thêm tail -10 bạn sẽ chỉ nhận được 10 mới nhất.

watch -n 10 "ls -ltr|tail -10" 
+0

Tác vụ này sẽ bỏ qua các tệp nơi người tạo thay đổi thời gian của tệp thành zeroes ngay sau khi ceation. –

+0

như đã đề cập trong câu hỏi ban đầu của tôi, đồng hồ không chính xác những gì tôi muốn, vì nó sẽ lặp lại các tệp cuối cùng nếu không có đủ tệp mới và nó có giao diện ncurses. : -/ – msb

+0

Ồ, xin lỗi - tôi đã bỏ lỡ đề cập đến những lời nguyền rủa trong sự phấn khích của tôi để trả lời. Tôi sử dụng đồng hồ rất nhiều. – opentokix

0

Điều này hoạt động trong cygwinLinux. Một số giải pháp trước đó viết một tập tin sẽ làm cho đĩa bị đập.

kịch bản này không có vấn đề rằng:

SIG=1 
SIG0=SIG 
while [ $SIG != 0 ] ; do 
while [ $SIG = $SIG0 ] ; do 
    SIG=`ls -1 | md5sum | cut -c1-32` 
    sleep 10 
done 
SIG0=$SIG 
ls -lrt | tail -n 1 
done