Làm cách nào để chạy lệnh khi nội dung của thư mục được cập nhật?


27

Có một thư mục Acó nội dung được thay đổi thường xuyên bởi những người khác.

Tôi đã tạo một thư mục cá nhân Bnơi tôi giữ tất cả các tệp đã từng có A.

Hiện nay, tôi chỉ thỉnh thoảng chạy rsyncđể có được các tập tin được sao lưu từ Ađến B. Tuy nhiên, tôi sợ khả năng một số tệp sẽ được thêm vào Avà sau đó bị xóa khỏi Atrước khi tôi có cơ hội sao chép chúng sang B.

Cách tốt nhất để ngăn chặn điều này xảy ra là gì? Lý tưởng nhất là tôi muốn tập lệnh sao lưu hiện tại của mình chạy mỗi khi nội dung Ađược thay đổi.

Câu trả lời:


29

Nếu bạn đã cài đặt các công cụ inotify, bạn có thể sử dụng inotifywaitđể kích hoạt một hành động nếu một tệp hoặc thư mục được ghi vào:

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

Trường hợp -qqchuyển đổi hoàn toàn im lặng, -rlà đệ quy (nếu cần) và -elà sự kiện để giám sát, trong trường hợp này modify. Từ man inotifywait:

sửa đổi
Một tập tin đã xem hoặc một tập tin trong một thư mục đã xem đã được ghi vào.

5
incrondcũng có thể được quan tâm.
Shawn J. Goff

1
Mát mẻ. Tôi có thể đặt đoạn script trên vào bashrc để nó chạy khi tôi đăng nhập không? Có cách nào khác để tôi có thể chạy nó mọi lúc không?
oadams

Để đăng nhập, có /etc/profilecho toàn hệ thống hoặc .bash_profilechỉ cho người dùng của bạn. Để chạy nó sau khi khởi động, nó phụ thuộc vào hương vị Unix / Linux của bạn; /etc/rc.local, /etc/rc.d/hoặc/etc/init.d/
jasonwryan

1
Đối với các thư mục lớn hơn, bạn có thể muốn xem xét sử dụng công --monitortắc (và thay thế đầu ra cho vòng lặp của bạn), nếu không, có rất nhiều chi phí khi inotifywaitđược bắt đầu lại nhiều lần
Tobias Kienzler

Giải pháp này đáng tin cậy như thế nào để chạy tập lệnh cho mỗi tệp được thêm vào cây thư mục thông qua máy chủ FTP (giả sử rằng một tệp mới được thêm trung bình 3 phút một lần và điều này có thể tiếp tục trong nhiều năm)? Nếu không rất, có một giải pháp thay thế?
Nikola Novak

5

Nói đúng ra, nếu ai đó đánh rơi một tập tin và rất nhanh chóng gỡ bỏ nó, bạn có thể bỏ lỡ nó. Việc sử dụng inotify (trong Linux hoặc một tính năng tương tự trong các đơn vị khác) làm cho cửa sổ rủi ro trở nên nhỏ.

Nếu bạn có thể gắn hệ thống tệp bạn chọn vào thư mục đó (tôi nhận thấy đây có thể không phải là một tùy chọn), bạn có thể đặt một hệ thống ghi lại tất cả các phiên bản tệp, ví dụ như copyfs .


4

Hãy thử entrcông cụ dòng lệnh có thể chạy các lệnh tùy ý khi tệp thay đổi. Kể từ phiên bản 2.9, một tùy chọn xem thư mục ( -d) đã được thêm vào để phản ứng với các sự kiện khi một tệp mới được thêm vào một thư mục.

Ví dụ để chạy tiện ích nếu một tệp mới được thêm vào dự án:

$ while true; do
> echo src/* | entr -d your_command
> done

Trong chế độ xem thư mục, thư mục mẹ của mỗi tệp được thêm vào danh sách theo dõi.

Hàm ý duy nhất của điều này là nếu một tệp mới xuất hiện thì nó phải thoát để cho phép một vòng lặp shell bên ngoài quét lại hệ thống tệp.

Đây là phiên bản không có tùy chọn xem thư mục:

$ while true; do
> echo src/* src | entr your_command
> done

Đây là một ví dụ đơn giản hơn tùy thuộc vào nhu cầu của bạn:

$ ls -d * | entr sh -c 'rsync -vuar A B'

Kiểm tra: trang web entrproject.org để biết thêm chi tiết.


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.