inotifywait - dapatkan nama file lama dan baru saat mengganti nama

8

Saya mencari cara yang dapat diandalkan untuk mendeteksi penggantian nama file dan mendapatkan nama file lama dan baru. Inilah yang saya miliki sejauh ini:

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

Ini berfungsi, tetapi mengasumsikan Anda tidak akan pernah memindahkan file ke dalam atau keluar dari folder yang ditonton. Ini juga mengasumsikan bahwa acara datang berpasangan, pertama dipindahkan_dari, lalu dipindahkan_to. Saya tidak tahu apakah ini selalu benar (bekerja sejauh ini).

Saya membaca inotify menggunakan cookie untuk menautkan acara. Apakah cookie dapat diakses entah bagaimana? Karena tidak memiliki cookie, saya berpikir untuk menggunakan cap waktu untuk menghubungkan acara bersama. Adakah kiat untuk mendapatkan DARI dan TO dengan cara yang lebih andal?

Inti skrip lengkap .

aBe
sumber

Jawaban:

6

Saya pikir pendekatan Anda benar, dan melacak cookie adalah cara yang kuat untuk melakukan ini. Namun, satu-satunya tempat di sumber inotify-tools (3.14) yang cookiedireferensikan adalah di header yang mendefinisikan structuntuk mencocokkan API API.

Jika Anda suka hidup di tepi, tambalan ini ( edisi # 72 ) berlaku bersih untuk 3.14 dan menambahkan penentu %cformat untuk cookie acara dalam 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 );

Perubahan ini memodifikasi libinotifytools.so, bukan inotifywaitbiner. Untuk menguji sebelum instalasi:

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

Dengan asumsi bahwa MOVED_FROM selalu terjadi sebelum MOVED_TO (memang, lihat fsnotify_move(), dan ini adalah antrian yang dipesan , meskipun gerakan independen mungkin saling terkait ) dalam skrip Anda, Anda menyimpan detail ketika Anda melihat baris MOVED_FROM (mungkin dalam array asosiatif yang diindeks oleh ID), dan jalankan pemrosesan Anda ketika Anda melihat MOVED_TO dengan separuh informasi yang cocok.

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

(Dengan tiga utas berjalan untuk mengacak sepasang file setiap 10.000 kali, saya tidak pernah melihat satu pun kejadian yang tidak beres, atau interleaving peristiwa. Mungkin tergantung pada sistem file dan kondisi lainnya tentunya.)

mr.spuratic
sumber
1
Cantik. Saya tidak pernah menerima jawaban yang mendetail dan berguna seperti itu sebelumnya. Terima kasih banyak!! Saya pikir dimasukkannya tambalan Anda dalam versi resmi dapat memfasilitasi pembuatan alat yang membantu menjaga konsistensi antara file teks (html, css, md, ...) dan aset yang dirujuk (jpg, gif, mp4, ...). Apakah Anda mengirim permintaan tarik? :)
sebelum
Saya harap fitur ini akan membuatnya menjadi versi resmi, tetapi saya belum memalsukannya, dan saya tidak yakin kapan saya akan menemukan waktu untuk bercabang dan memperbarui semua komentar (doxygen).
mr.spuratic
Akan sangat keren untuk mendapatkan ini di hulu!
Tim Stoop