Cách sử dụng inotifywait để xem thư mục tạo tệp của tiện ích mở rộng cụ thể


21

Tôi đã thấy câu trả lời này .

Bạn nên xem xét sử dụng inotifywait, như một 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

Câu hỏi của tôi là, đoạn script trên xem một thư mục để tạo các tệp thuộc bất kỳ loại nào, nhưng làm cách nào để sửa đổi inotifywaitlệnh chỉ báo cáo khi một tệp thuộc loại / tiện ích mở rộng nhất định được tạo ra (hoặc di chuyển vào thư mục) - ví dụ: nó nên báo cáo khi bất kỳ .xmltập tin được tạo ra.

Tôi đã nói gì

Tôi đã chạy inotifywait --helplệnh và đã đọc các tùy chọn dòng lệnh. Nó có --exclude <pattern>--excludei <pattern>ra lệnh cho EXCLUDE các loại tệp nhất định (bằng cách sử dụng regEx), nhưng tôi cần một cách để INCLUDE chỉ các tệp của một loại / tiện ích mở rộng nhất định.


BTW, sử dụng pathở trên có lẽ không phải là tên biến tốt nhất nếu bạn muốn chơi với cái này đầu tiên trong một vỏ. Nếu bạn sử dụng nó, thì bạn sẽ không thể sử dụng các lệnh và mọi thứ vì điều này về cơ bản chỉ là ghi đè tiêu chuẩn PATH. Do đó tôi khuyên bạn nên sử dụng một tên var thay thế, như fpaththay vào đó. tức là while read fpath action filebất kỳ lệnh tiêu chuẩn nào thường có sẵn từ shell của bạn vẫn sẽ có.
Baptiste Mathus

thật là nực cười khi không có tùy chọn bao gồm.
erandros

Câu trả lời:


17

Làm cách nào để sửa đổi lệnh inotifywait chỉ báo cáo khi một tệp thuộc loại / tiện ích mở rộng nhất định được tạo

Xin lưu ý rằng đây là mã chưa được kiểm tra vì tôi không có quyền truy cập inotifyngay bây giờ. Nhưng một cái gì đó giống như điều này nên hoạt động:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        if [[ "$file" =~ .*xml$ ]]; then # Does the file end with .xml?
            echo "xml file" # If so, do your thing here!
        fi
    done

2
Điều này không hoạt động và tôi đã thử nghiệm nó với inotifywait.
TheBetterJORT

1
Làm thế nào để bạn chạy này? Đây có phải là lệnh một lần, hay nó cần phải được chạy trong một vòng lặp hoặc bất cứ điều gì tương tự? Có lẽ là một phần của incron(tôi hy vọng không).
SDsolar

@SDsolar Nó khác nhau. Đối với tôi, tôi thường chạy inotifyhoặc với nohuphoặc bắt đầu nó với dịch vụ một tùy chỉnh systemd. Thường xuyên nhất là sau này.
malawlawns

9

Sử dụng một phủ định kép:

inotifywait -m --exclude "[^j][^s]$" /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
    done

Điều này sẽ chỉ bao gồm các tệp javascript


1
Thật tuyệt, tôi thích rằng nó chuyển bộ lọc sang inotifywaitthay vì tạo ra đầu ra lớn cho tất cả các tệp và bộ lọc sau đó (như trong câu trả lời khác). Chưa thử, nhưng tôi đoán điều đó sẽ thực hiện nhanh hơn một chút.
TMG

Đây chỉ là những gì tôi đang tìm kiếm. Làm thế nào để sửa đổi --excludeđầu vào để xem .extcác tập tin. Điều này chỉ được chạy một lần hoặc trong một vòng lặp for?
Kurokirasama

Đó là một daemon, vì vậy nó sẽ chạy cho đến khi nó gặp sự cố hoặc bạn tắt nó :)
Jonas Earendel

Xin lỗi, bỏ lỡ câu hỏi đầu tiên. inotifywait -m --exclude "[^.][^e][^x][^t]$" /home/jonas/Skrivbord/test -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" done Tôi chắc chắn rằng regex có thể được tối ưu hóa, nhưng em bé này hoạt động :)
Jonas Earendel

Thanx !! Tôi se thử no!!
Kurokirasama

3

Mặc dù cách tiếp cận tiêu cực kép của câu trả lời trước là một ý tưởng hay vì (như đã lưu ý), nó thực sự chuyển công việc lọc sang inotifywait, nhưng điều đó không đúng.

Ví dụ: nếu một tệp kết thúc asthì nó sẽ không khớp [^j][^s]$vì chữ cái cuối cùng skhông khớp [^s], do đó nó sẽ không bị loại trừ.

Theo thuật ngữ Boolean, nếu Slà câu lệnh:

"lá thư cuối cùng là s"

Jlà tuyên bố:

"bức thư áp chót là j"

thì giá trị của --excludetham số sẽ tương đương về mặt ngữ nghĩa not(J and S), theo luật của De Morgannot(J) or not(S).

Một vấn đề tiềm năng khác là trong zsh, $pathlà một biến tích hợp đại diện cho mảng tương đương $PATH, do đó, while read path ...dòng sẽ hoàn toàn rối tung $PATHvà khiến mọi thứ trở nên không thể thực hiện được từ trình bao.

Do đó, cách tiếp cận đúng là:

inotifywait -m --exclude "[^j].$|[^s]$" /path -e create -e moved_to |
    while read dir action file; do
        echo "The file '$file' appeared in directory '$dir' via '$action'"
    done

Lưu ý những .điều cần thiết sau đó [^j]để đảm bảo rằng trận đấu được áp dụng ở vị trí áp chót, và cũng |không nên thoát ký tự (đại diện cho boolean HOẶC đã đề cập ở trên) vì --excludecó biểu thức chính quy mở rộng POSIX.

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.