Dosya değişikliğini izlemek ve komutu yürütmek için Bash betiği


12

Bir sürü alt klasör içeren bir klasör var, bu klasörler uzantısı asciidoctorile dosyalanmış oluşturduk .adoc.

Dosyalarda her değişiklik yaptığımda (ki sıklıkla) çalıştırmam gerekiyor

asciidoctor -q filename.adoc

HTML biçiminde derlemek için.

Süreci otomatikleştirmeye çalışıyorum. şimdiye kadar entr kullanarak bu ile geldim :

ls *.adoc | entr asciidoctor -q *.adoc

ancak alt klasörler için değil, yalnızca mevcut klasörle çalışır. Bu varyasyonu denedim, ama çalışmıyor:

find . -name '*.adoc' | entr asciidoctor -q *.adoc

Bu alt süreci tüm alt klasörler için nasıl uygulayabileceğim hakkında bir fikrin var mı?


Yanıtlar:


17

Linux, dosya oluşturma, değiştirme, kaldırma gibi tüm dosya sistemi olaylarını izlemek için hoş bir arayüz sağlar. Arayüz inotifysistem çağrıları ailesidir, bu çağrıları kullanan kullanıcı alanı yardımcı programları inotify-toolsUbuntu'daki paket tarafından sağlanır (evren deposunda bulunur). Zaten sahip değilseniz, aşağıdakileri yükleyin:

sudo apt-get install inotify-tools

inotify-toolssağlar inotifywaitve inotifywatchikililer, birincisine ihtiyacımız var.


Bu nedenle asciidoctor -q some_file, herhangi bir .adocdosya değiştirildiğinde ( some_filebununla değiştirilecektir) komutu çalıştırmak istiyorsunuz , eğer .adocdosyalarınız dizinde /foo/barvarsa, saati ayarlayabilirsiniz:

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
  • -qsessiz modu etkinleştirir, inotifywaitkendisinden bilgi yok

  • -m monitör modunu etkinleştirir, aksi takdirde ilk olaydan sonra çıkacaktır

  • --event modify, yalnızca modifyetkinlikle, yani bir dosya değiştirildiğinde. Diğer olası değerler open, closevb.

  • --format %w, dosya adını başka bir komuta girdi olarak kullanacağımızdan, yalnızca diğer bilgilerden ziyade değiştirilen dosya adının kullanılmasını istiyoruz

  • /foo/bar/*.adocdizin .adocaltındaki tüm dosyalara genişletilecek/foo/bar


Şimdi yukarıdakiler, herhangi bir değişiklik yapıldığında dosya adını gösterecektir, şimdi dosya adı üzerindeki komutu çalıştırmak için (komutun STDIN üzerinden argümanlar aldığını varsayarak):

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc | asciidoctor -q

Ayrıca dizinde özyinelemeli bir saat ayarlayabilirsiniz, daha sonra grepyalnızca istediğiniz dosyaları filtrelemek için kullanmanız gerekir . Burada saati -rdizinde yinelemeli olarak ( ) ayarlamak ve yalnızca dosyaları filtrelemek için /foo/barkullanmak :grep.adoc

inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | asciidoctor -q

Dizinleri izlerken çıktı biçimi belirleyicisi %w dizin adına çözümlenir, bu nedenle %fdosya adını almamız gerekir . Dosyaları izlerken %fboş dizeye gider.

Ayrıca, inotifywait , daemon ( -d) modunda , her şeyi kodlayabileceğinizi ve / veya arka planda çalıştırabileceğinizi ve / veya onunla daha fazla seçenek oynayabileceğinizi unutmayın.

Ayrıca, asciidoctor herhangi bir komutla .

man inotifywaitDaha fazla fikir edinmek için kontrol edin .


Teşekkürler çalıştı. OSX için de benzer bir şey var. ama sanırım burası sormak için doğru yer değil.
kepek

@bran Evet, IMHO UL'ye gidiyor , bunu referans olarak kullanabilirsiniz.
heemayl

Harika cevap, sadece küçük bir düzeltme. -q programı "daha az ayrıntılı" yapar, -qq (double q) ölümcül hatalar dışında tamamen sessiz yapar.
jotadepicas

4

Kullanmak inotifywaittipik bir yaklaşımdır, ancak inotify-hookablebir dosya (veya dizin) değiştiğinde bir komut çalıştırmanıza izin veren ayrı bir yardımcı program da vardır :

inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'

Komutu bir kez tetikledikten sonra çıkmış gibi görünüyor; Sürekli izlemek için bir seçenek görmüyorum, bu yüzden şöyle bir şey yapabilirsiniz:

while true; do
    inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'
    echo "== $(date) : executed, continuing to monitor..."
done

Birkaç dosyayı veya dizini yinelemeli olarak izleme seçenekleri ve dosyaları / yolları yoksayma seçenekleri olduğunu unutmayın.


inotify-hookable komutu benim için çalıştırdıktan sonra çıkmıyor. Hmm
Maksimum

inotify-hookable farklı bir paketten kurulur:sudo apt-get install inotify-hookable
Bruno Silvano

3

Orada çok sayıda araç var, özellikle deponuzda arama yaparsanız

apt-cache search monitor | grep file

bize birçok araç sunuyor. Ama onları test etmek zorunda değilsiniz çünkü bunu ben yaptım.

Bu araçları ve diğerlerini test ettim:

  • Inotify
  • fswatch
  • fileWATCH
  • parça kumaş
  • fileschanged
  • entr

Bu araçlar arasında üç tanesini kullanışlı ve güvenilir buldum:

  • direvent | C ile yazılmış GNU
  • iwatch | Perl'de
  • fsniper

Ve bu üçü arasında, kuşkusuz , şüphesiz en iyisidir.

Kullanmak o kadar kullanışlı ve güvenilir ki, sahip olduğum mikro hizmetlerimle basit bir boru hattı için kullandım .

direvent.conf izlemek için dosya

syslog {
    facility local0;
    tag "direvent";
    print-priority yes;
}

watcher {
    path /var/www/html/ir/jsfun/build/react recursive;
    file "*.js";
    event write;
    command "/usr/bin/xdotool search --onlyvisible  --class firefox key F5";
    option (stdout, stderr, wait);
}

Bu, yazma için bir değişiklik olduğunda, bu komutun yürütüldüğü - ki bu da bir betiği olabilir .

whileDöngü veya başka şeyler kullanmaya gerek yok .


özellikleri

  • bir dizini tekrar tekrar izlemek
  • arka planda veya arka planda bir daemon olarak çalıştırılabilir
  • taşınabilir. Ubuntu'da ve CentOS7 sunucusunda var
  • dosya adı raporu
  • Dosya eşleştirmeyi desteklemek için normal ifade
  • mulit dosya izleme (sadece bir dosya türünden daha fazlasını izleyin)
  • senkronizasyon komutları yürütme (çoklu izleyicimiz varsa)
  • syslog işleme (istersek syslog'da oturum aç)
  • çalışmak için kolay ve iyi CLI ve yapılandırma dosyası tasarımı

Sergey Poznyakoff tarafından geliştirildi .


yükleme

sudo apt install direvent

Ancak, kaynak kodunu kullanarak kurmak oldukça kolay ve basittir, bu da son sürümü verir (şu anda: 5.1).


-3

Peki ben aşağıdakileri tavsiye ederim.

#!/bin/bash
#Script
for SRC in *.adoc; 
      do
      asciidoctor -q $SRC
  done

1
OP sadece değişiklikler yapıldığında komutu çalıştırmak istiyor ..
heemayl
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.