Liên tục phát hiện (các) tệp mới với các công cụ inotify trong nhiều thư mục theo cách đệ quy


17

Tôi chỉ cài đặt công cụ inotify. Tôi muốn liên tục phát hiện (các) tệp mới với các công cụ thông báo trong nhiều thư mục theo cách đệ quy và gửi email bằng postfix. Tôi có thể có thể xử lý việc gửi email bằng phần postfix. Tôi chỉ đang cố gắng tìm ra cách tốt nhất để giải quyết vấn đề này khi cố gắng phát hiện (các) tệp mới. Bởi vì đôi khi nhiều tập tin được thêm vào cùng một lúc.

Câu trả lời:


39

inotifywait (một phần của công cụ inotify ) là công cụ phù hợp để thực hiện mục tiêu của bạn, không quan trọng rằng một số tệp đang được tạo cùng một lúc, nó sẽ phát hiện ra chúng.

Đây là một kịch bản mẫu:

#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done

inotifywait sẽ sử dụng các tùy chọn này.

-m để theo dõi thư mục vô thời hạn, nếu bạn không sử dụng tùy chọn này, một khi nó đã phát hiện ra một tệp mới, tập lệnh sẽ kết thúc.

-r sẽ giám sát các tệp đệ quy (nếu có nhiều thư mục / tệp thì có thể mất một lúc để phát hiện các tệp mới được tạo)

-e tạo là tùy chọn chỉ định sự kiện cần theo dõi và trong trường hợp của bạn, nó nên được tạo để quan tâm đến các tệp mới

--format '% w% f' sẽ in ra tệp theo định dạng /complete/path/file.name

"$ {MONITORDIR}" là biến chứa đường dẫn cần theo dõi mà chúng ta đã xác định trước đó.

Vì vậy, trong trường hợp một tệp mới được tạo, inotifywait sẽ phát hiện ra nó và sẽ in đầu ra (/complete/path/file.name) cho đường ống và trong khi đó sẽ gán đầu ra đó cho biến NEWFILE .

Trong vòng lặp while, bạn sẽ thấy một cách để gửi thư đến địa chỉ của bạn bằng tiện ích mailx sẽ hoạt động tốt với MTA cục bộ của bạn (trong trường hợp của bạn, Postfix).

Nếu bạn muốn theo dõi một số thư mục, inotifywait không cho phép nhưng bạn có hai tùy chọn, tạo tập lệnh cho mọi thư mục để theo dõi hoặc tạo chức năng bên trong tập lệnh, đại loại như sau:

#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"    

monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &

Tôi đã quên thêm một số giải thích liên quan đến các lệnh được sử dụng trong tập lệnh mẫu đó là lý do để chỉnh sửa câu trả lời của tôi ... Tôi cũng đã thêm tập lệnh trong trường hợp op muốn theo dõi một số thư mục. Về công cụ inotifywait, không thể trả lời câu hỏi mà không đề cập đến nó bởi vì op đang sử dụng công cụ inotify. Nhân tiện, tôi là người mới ở đây nên tôi cần tìm hiểu nhiều về nghi thức mạng, vì vậy, xin lỗi nếu câu trả lời của tôi trùng lặp với bạn, đó không phải là điều tôi muốn tôi chỉ muốn đưa ra câu trả lời hoàn chỉnh cho op. Một lần nữa xin lỗi.
sahsanu

Không có vấn đề và chào mừng đến SU. Tìm hiểu về netiquette thường được thực hiện một cách khó khăn, vì nó không thực sự được xác định ở bất cứ đâu.
harrymc

4
@sahsanu Tôi không đồng ý về toàn bộ điều "netiquette". Mỗi người đang trả lời câu hỏi từ quan điểm riêng. Không có sự trùng lặp giữa các câu trả lời, cũng không có câu trả lời nào được viết lại. Không thể có câu trả lời khác nhau theo cách đó khi câu hỏi quá cụ thể. Cảm ơn bạn rất nhiều vì đã dành thời gian để trả lời câu hỏi rất chi tiết. Điều này đã giúp nhiều hơn bạn biết, đối với một người như tôi, người chỉ đang tìm hiểu về tất cả những điều này. Bạn đã cứu tôi vô số giờ.
David Custer


Nghi thức mạng trong một môi trường phát triển hoàn toàn không thể được xác định. Đó là thông lệ trên trang web này không trùng lặp câu trả lời trừ khi chúng được viết xấu, và thậm chí sau đó nó được khuyến khích sửa chúng thay vì thông qua chỉnh sửa. Đó luôn là quyền của bạn trong một cộng đồng dân chủ không đồng ý. @sahsanu có thể tránh nhận xét của tôi bằng cách tham khảo câu trả lời trước của tôi trong khi hiển thị kịch bản của anh ấy, điều này sẽ nhận được sự chấp thuận của bạn trong mọi trường hợp. Đó là những gì tôi sẽ làm ở vị trí của anh ấy và đó là nghi thức mạng của tôi, điều mà tôi tin rằng tôi chia sẻ với người khác (tất nhiên không phải với tất cả mọi người).
harrymc

8

Sử dụng inotifywait , ví dụ:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

Để biết thêm thông tin và ví dụ, hãy xem bài viết
Cách sử dụng các công cụ inotify để kích hoạt các tập lệnh trên các sự kiện hệ thống tập tin .


1
Nếu bất cứ ai sử dụng điều này và chuyển đổi các biến từ chữ in hoa, bạn sẽ không thể chạy một số lệnh bên trong. Điều này là do bạn sẽ ghi đè lên biến $ PATH.
Savageman

2
@Savageman Sử dụng tên biến chữ hoa cho các biến của riêng bạn được mạnh mẽ khuyến khích chính vì lý do này. Tên biến Uppercase được dành riêng cho sử dụng hệ thống; biến của riêng bạn nên sử dụng chữ thường.
tripleee

@tripleee Cảm ơn thông tin, sẽ không sử dụng vars chữ hoa nữa :)
Savageman

0

Đối với một số thư mục bạn có thể làm điều này:

#!/bin/bash


monitor() {
  inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
  do
     echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
  done
          }


monitor &

Dưới đây là danh sách ví dụ về các thư mục trong tệp /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
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.