Belirli bir uzantıdaki dosyaların oluşturulması için bir dizini izlemek için inotifywait nasıl kullanılır


21

Bu cevabı gördüm .

Örnek olarak inotifywait kullanmayı düşünmelisiniz:

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

Benim sorum, yukarıdaki komut dosyası herhangi bir tür dosya oluşturmak için bir dizini izler, ama inotifywaitsadece belirli bir tür / uzantı bir dosya oluşturulduğunda (veya dizine taşındığında) rapor vermek için komutu nasıl değiştiririm - örneğin herhangi bir .xmldosya oluşturulduğunda rapor edin .

NELER YAPTIK:

inotifywait --helpKomutu çalıştırdım ve komut satırı seçeneklerini okudum. O var --exclude <pattern>ve (regEx kullanarak) belirli türdeki dosyaları EXCLUDE--excludei <pattern> komutları , ama ben sadece belirli bir tür / uzantının dosyalarını DAHİL bir yol gerekir .


BTW, pathyukarıda kullanmak , muhtemelen bir kabukta bu ile oynamak istiyorsanız en iyi değişken adı değildir. Bunu kullanırsanız, komutları ve her şeyi kullanamazsınız, çünkü bu temelde standardı geçersiz kılmıştır PATH. Bu yüzden fpathbunun yerine alternatif bir değişken adı kullanmanızı öneririm . yani, while read fpath action filegenellikle kabuğunuzda bulunan herhangi bir standart komut yine de kalır.
Baptiste Mathus

dahil etme seçeneği olmaması çok saçma.
erandros

Yanıtlar:


17

inotifywait komutunu yalnızca belirli türde / uzantıya sahip bir dosya oluşturulduğunda rapor verecek şekilde nasıl değiştirebilirim?

Şu anda erişimim olmadığından bu kodun test edilmediğini lütfen unutmayın inotify. Ama buna benzer bir şey işe yaramalı:

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
Bu işe yarıyor ve inotifywait ile test ettim.
TheBetterJORT

1
Bunu nasıl yürütüyorsun? Bir kerelik bir komut mu, yoksa bir döngüde veya bunun gibi bir şeyde mi çalışması gerekiyor? Belki bir parçası olarak incron(umarım değil).
SDsolar

@SDsolar Değişir. Benim için genellikle inotifyya nohupözel bir systemd servisi ile ya da bu sistemle çalıştırıyorum . Çoğu zaman ikincisi.
maulinglawns

9

Çift negatif kullanın:

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

Bu sadece javascript dosyalarını içerecektir


1
Güzel, ben inotifywaittüm dosyalar ve daha sonra (diğer cevap gibi) filtre büyük çıktı üretmek yerine filtreleme kaydırır gibi. Denemedim, ama sanırım bu biraz daha hızlı.
TMG

Aradığım şey buydu. Dosyaları --excludeizlemek için giriş nasıl değiştirilir .ext. Bu yalnızca bir kez mi yoksa for döngüsü içinde mi çalıştırılır?
kurokirasama

Bu bir artalan programı, bu yüzden çökene veya onu kapatana kadar koşacak :)
Jonas Earendel

Üzgünüm, ilk soruyu kaçırdım. 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 Regex optimize edilebilir eminim, ama bu bebek çalışıyor :)
Jonas Earendel

Thanxs !! Ben bunu deneyeceğim!!
kurokirasama

3

Önceki yanıtın çift ​​olumsuz yaklaşımı iyi bir fikir olsa da (TMG'nin belirttiği gibi) gerçekten filtreleme işini değiştirir, inotifywaitdoğru değildir.

Bir dosya uçları Örneğin, aso zaman uymayacak [^j][^s]$nihai mektup nedeniyle suymuyor [^s], bu nedenle hariç edilmeyecektir.

Boole terimleriyle, eğer Sifade:

"son harf s"

ve Jifade:

"sondan bir önceki mektup j"

Sonra değeri --excludeparametre semantik olarak eşit olmalıdır not(J and S)tarafından hangi De Morgan yasaları olduğunu not(J) or not(S).

Bir diğer potansiyel sorun olarak yani zsh, $pathbir dahili dizisi denk düşen değişken $PATH, yani while read path ...hattı tamamen pisliği olur $PATHve neden her kabuktan unexecutable olmak için.

Bu nedenle doğru yaklaşım:

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

Maçın sondan bir önceki konuma uygulandığından emin olmak için .hangisine ihtiyaç duyulduğunu [^j]ve ayrıca POSIX genişletilmiş düzenli ifadeleri aldığı için |burada (yukarıda belirtilen boole OR'yi temsil eden) karakterin kaçmaması gerektiğini unutmayın --exclude.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.