Sử dụng inotifywait để di chuyển tệp khi nó tải trong thư mục dropbox


12

Tôi đang cố gắng tìm cách chuyển ngay một tập tin sang một thư mục khác ngay khi nó xuất hiện trong hộp thư của tôi trên CentOS.

Tôi đã truy cập internet để tìm một số manh mối nhưng tôi không thể tìm hiểu thêm ngoài thực tế là tôi cần sử dụng inotifyđể gọi một tập lệnh sẽ xử lý tệp khi nó xuất hiện.

Kiến thức BASH của tôi rất hạn chế và tôi nghi ngờ tôi có thể viết điều này bằng PHP.

Nói cách khác, làm thế nào tôi có thể di chuyển một tập tin sang một thư mục khác ngay khi nó xuất hiện bằng cách sử dụng inotify?


Là tên của tập tin có thể dự đoán được? Hay đó là vị trí? Thêm chi tiết sẽ hữu ích ...
jasonwryan

@jasonwryan Đó là một thư mục dropbox để vị trí phù hợp. Và nó áp dụng cho bất kỳ tập tin nào bị rơi trong thư mục đó.
Ortix92

Câu trả lời:


13

Đây là một cách tiếp cận đơn giản:

#!/usr/bin/env bash

dir=/home/ortix/Dropbox/new/
target=/home/ortix/movedfiles/

inotifywait -m "$dir" --format '%w%f' -e create |
    while read file; do
        mv "$file" "$target"
    done

Với nhiều chi tiết hơn về các loại tệp bạn muốn di chuyển, bạn có thể thêm một số kiểm tra, ghi nhật ký, v.v ...


Tôi đã không thể kiểm tra một trong những câu trả lời được đề xuất. Mọi thứ đã lên. Sẽ làm như vậy càng sớm càng tốt! Tôi có một câu hỏi mặc dù. Nếu tôi đặt cái này vào một tập tin bash và chạy nó, tôi cho rằng nó sẽ chạy trong nền, đúng không? Tôi luôn có cảm giác rằng một kịch bản là một thứ chạy một lần, nhưng ở đây inotifywait tiếp tục chạy, đúng không?
Ortix92

2
nghe về createsự kiện không đúng, vì bạn sẽ thực hiện mvmột tệp có thể không được sao chép hoàn toàn trên đĩa. Xem câu trả lời @Gilles, sử dụng close_writesự kiện thay thế.
fduff

3
@fduff Xem câu trả lời của Gilles luôn là điều đúng đắn ...
jasonwryan

17

Lệnh inotifywaitin một thông báo mỗi khi nội dung của thư mục được chỉ định thay đổi. Bạn sẽ cần chọn đúng sự kiện: không phải khi tệp được tạo mà là khi Dropbox hoàn tất tải xuống. Tôi không biết chính xác cách Dropbox vận hành. Nếu nó ghi vào tệp ở vị trí cuối cùng của nó, hãy lắng nghe close_writecác sự kiện. Nếu nó ghi vào tệp vào một vị trí tạm thời và sau đó di chuyển nó vào vị trí, hãy lắng nghe moved_tocác sự kiện. Truyền các tùy chọn -m -qđể inotifywaitnó tiếp tục nghe các sự kiện (theo mặc định, nó chỉ chờ sự kiện tiếp theo) và chỉ in các tin nhắn có liên quan.

cd ~/Dropbox/myfolder
inotifywait -m -q -e close_write --format %f . | while IFS= read -r file; do
  cp -p "$file" /path/to/other/directory
done

1
Điều này không thành công cho các tập tin bao gồm dòng mới trong tên của họ. Tôi không thể tìm ra cách để có inotifywaittên tệp kết thúc null. Điều tốt nhất tôi có thể làm là sử dụng một ký tự ít có khả năng hơn dòng mới, ví dụ %f$'\001', và sử dụng -d $'\001'với while IFS= read -rhoặc xargs.
Tạm dừng cho đến khi có thông báo mới.

1
@DennisWilliamson Vâng, inotifywaitthật khó chịu theo cách đó. Bạn có thể sử dụng một cái gì đó như //%f, vì tên tệp sẽ không bao giờ chứa dấu gạch chéo kép miễn là đường dẫn để xem không; sau đó sự khó chịu là ở phía phân tích cú pháp.
Gilles 'SO- ngừng trở nên xấu xa'
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.