inotifywait - nhận tên tệp cũ và mới khi đổi tên


8

Tôi đang tìm kiếm một cách đáng tin cậy để phát hiện đổi tên tệp và nhận cả tên tệp cũ và mới. Đây là những gì tôi có cho đến nay:

COUNTER=0;
inotifywait -m --format '%f' -e moved_from,moved_to ./ | while read FILE
do
if [ $COUNTER -eq 0 ]; then
    FROM=$FILE;
    COUNTER=1;
else
    TO=$FILE;
    COUNTER=0;
    echo "sed -i 's/\/$FROM)/\/$TO)/g' /home/a/b/c/post/*.md"
    sed -i 's/\/'$FROM')/\/'$TO')/g' /home/a/b/c/post/*.md
fi
done

Nó hoạt động, nhưng nó giả định rằng bạn sẽ không bao giờ di chuyển các tập tin vào hoặc ra khỏi thư mục đã xem. Nó cũng giả định rằng các sự kiện đến theo cặp, đầu tiên là move_from, sau đó move_to. Tôi không biết nếu điều này luôn luôn đúng (hoạt động cho đến nay).

Tôi đọc inotify sử dụng cookie để liên kết các sự kiện. Là cookie có thể truy cập bằng cách nào đó? Thiếu cookie, tôi nghĩ về việc sử dụng dấu thời gian để liên kết các sự kiện với nhau. Bất cứ lời khuyên nào về việc TỪ và ĐẾN một cách đáng tin cậy hơn?

Kịch bản đầy đủ ý chính .

Câu trả lời:


6

Tôi nghĩ rằng cách tiếp cận của bạn là chính xác và theo dõi cookie là một cách mạnh mẽ để làm điều này. Tuy nhiên, vị trí duy nhất trong nguồn công cụ inotify (3.14) cookieđược tham chiếu là trong tiêu đề xác định structđể khớp với API kernel.

Nếu bạn thích sống ở rìa, bản vá này ( vấn đề # 72 ) áp dụng hoàn toàn cho 3.14 và thêm một công %ccụ xác định định dạng cho cookie sự kiện ở dạng hex:

--- libinotifytools/src/inotifytools.c.orig     2014-10-23 18:05:24.000000000 +0100
+++ libinotifytools/src/inotifytools.c  2014-10-23 18:15:47.000000000 +0100
@@ -1881,6 +1881,12 @@
                        continue;
                }

+               if ( ch1 == 'c' ) {
+                       ind += snprintf( &out[ind], size-ind, "%x", event->cookie);
+                       ++i;
+                       continue;
+               }
+
                if ( ch1 == 'e' ) {
                        eventstr = inotifytools_event_to_str( event->mask );
                        strncpy( &out[ind], eventstr, size - ind );

Thay đổi này sửa đổi libinotifytools.so, không phải là inotifywaitnhị phân. Để kiểm tra trước khi cài đặt:

LD_PRELOAD=./libinotifytools/src/.libs/libinotifytools.so.0.4.1 \
  inotifywait  --format="%c %e %f" -m -e move /tmp/test
Setting up watches.
Watches established.
40ff8 MOVED_FROM b
40ff8 MOVED_TO a

Giả sử rằng MOVED_FROM luôn xảy ra trước MOVED_TO (nó có, nhìn thấy fsnotify_move()và đó là một hàng đợi theo thứ tự , mặc dù các chuyển động độc lập có thể bị xen kẽ) trong tập lệnh của bạn, bạn lưu trữ các chi tiết khi bạn thấy một dòng MOVED_FROM (có lẽ trong một mảng kết hợp được lập chỉ mục bởi ID), và chạy quá trình xử lý của bạn khi bạn thấy MOVED_TO với một nửa thông tin phù hợp.

declare -A cache
inotifywait  --format="%c %e %f" -m -e move /tmp/test |
while read id event file; do
    if [ "$event" = "MOVED_FROM" ]; then
        cache[$id]=$file
    fi
    if [ "$event" = "MOVED_TO" ]; then
        if [ "${cache[$id]}" ]; then
            echo "processing ..."
            unset cache[$id]
        else
            echo "mismatch for $id"
        fi
    fi
done

.


1
Xinh đẹp. Tôi chưa bao giờ nhận được một câu trả lời chi tiết và hữu ích như vậy trước đây. Cảm ơn bạn rất nhiều!! Tôi nghĩ rằng việc đưa bản vá của bạn vào phiên bản chính thức có thể tạo điều kiện cho việc tạo ra các công cụ giúp giữ sự thống nhất giữa các tệp văn bản (html, css, md, ...) và các tài sản được giới thiệu (jpg, gif, mp4, ...). Bạn đang gửi một yêu cầu kéo? :)
aBe

Tôi hy vọng tính năng này sẽ biến nó thành phiên bản chính thức, nhưng tôi chưa kết thúc nó và tôi không chắc chắn khi nào tôi sẽ tìm thấy thời gian để rẽ nhánh và cập nhật tất cả các nhận xét (doxygen).
mr.spuratic

Sẽ thực sự mát mẻ để có được điều này ở thượng nguồn!
Tim Stoop
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.