Bir klasörü değişiklikler için izleyin ve bir değişiklik algılandığında bir komut çalıştırın.


10

Bir dosya belirli bir klasörde her değiştirildiğinde, otomatik olarak (Terminal) komutunu çalıştırmanın basit bir yolu var mı?

Bu, komut satırıyla veya bir sistem yerleşik uygulamasıyla, üçüncü taraf uygulamaları olmadan mümkün olmalıdır.

Herhangi bir fikir?



Yanıtlar:


6

Bunun gibi bir özellik listesi kaydedin ~/Library/LaunchAgents/test.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>test</string>
    <key>ProgramArguments</key>
    <array>
        <string>say</string>
        <string>yy</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>~/Desktop/</string>
    </array>
</dict>
</plist>

Temsilci, launchctl load ~/Library/LaunchAgents/test.plistoturum açıp tekrar oturum açarak yüklenebilir . Değişiklik yapmak, boşluğun boşaltılmasını ve yüklenmesini gerektirir.

Tilde ~/extension ( ) varsayılan olarak WatchPath’lerde çalışır. EnableGlobbing, ProgramArjuments için joker ve tilde genişleme ekler, ancak Program veya WatchPath'leri etkilemez.

İzlenen bir dosya son çağrıdan sonraki on saniye içinde değiştirilirse, buna benzer bir mesaj system.log dosyasına eklenir:

com.apple.launchd.peruser.501[146]: (test) Throttling respawn: Will start in 7 seconds

Mesajlardan kurtulmanın bir yolu sleep 10, senaryoların sonuna gibi bir şeyler eklemektir . ThrottleInterval değerini 10 olarak ayarlamak yardımcı olmaz.

İzlenen klasörlerin alt klasörlerinde değişiklikler algılanmadı.

Daha fazla bilgi için bkz. man launchdVe man launchd.plist.


5

entr (1) , dosyalar değiştiğinde komutları çalıştırmak için kullanılan bir yardımcı programdır. STDIN'deki bir dosya listesini okur ve yoklamayı önlemek için kqueue (2) işlevini kullanır .

Örnek:

ls my_project/*.html | entr echo "file changed"

3

Bir klasördeki içerikler değiştiğinde (Automator) komut dosyalarını çalıştırmanıza izin veren Klasör Eylemleri'ni kullanabilirsiniz. Bildiğim kadarıyla, Automator kolayca yeni bir klasör işlemi oluşturmanıza ve onu istediğiniz klasöre eklemenize izin veren bir şablona sahip. Ve bir "Kabuk Çalıştırma Komut Dosyası Çalıştır" işlemi ekleyerek, istediğiniz efekti elde etmeniz gerekir.


5
Teşekkürler, ancak "Klasör Eylemleri" yalnızca varolan bir dosya işaretlendiğinde değil, bir dosya klasöre eklendiğinde tetiklenir.
Louis B.

3

Klasör eylemleri, bir dosya eklendiğinde veya değiştirildiğinde tetiklemek için iyidir.

Ancak, değiştirilen tanımınız bir dosyayı silmeyi içeriyorsa, OSX Klasörü eylemleri bir dosyanın kaldırılıp kaldırılmadığını algılamaz.

Soruyu cevaplamak için:

  1. FileWatcher bağımlılıklarını buradan indirin: https://github.com/eonist/swift-utils

  2. Komut satırında hızlıca çalışırken, kendinizi tanıtın: http://krakendev.io/blog/scripting-in-swift

  3. Bir klasörü izlemek için bu kodu kullanın.

Kod:

var fileWatcher = FileWatcher(["~/Desktop/test/".tildePath])/*<---the fileWatcher instance must be scoped to your class*/

fileWatcher!.event = { event in
    Swift.print(self?.someVariable)//Outputs: a variable in your current class
    Swift.print(event.description)//Outputs: a description of the file change
}

1

Automator, bir klasöre bir şey eklendiğinde otomatik olarak çalışan "Klasör Eylemi" adı verilen bir iş akışı türüne sahiptir. Bir tane oluşturun ve ardından "Shell Komut Dosyasını Çalıştır" işlemini kullanın.


4
Teşekkürler, ancak "Klasör Eylemleri" yalnızca varolan bir dosya işaretlendiğinde değil, bir dosya klasöre eklendiğinde tetiklenir.
Louis B.

Tamam. Afedersiniz.
Timothy Mueller-Harder,

0

Böyle bir şey denemek isteyebilirsiniz:

touch /tmp/dirb.tmp
while true do 
  ls /thedirtocheck > /tmp/dira.tmp 
  diff /tmp/dira.tmp /tmp/dirb.tmp || echo "something changed" 
  cp /tmp/dira.tmp /tmp/dirb.tmp 
  sleep 100 
done

En azından ls -ldosya değişikliklerini de yakalamak için ihtiyacınız var .
yokuş yukarı

sağ .... cevapsız
Holger von Ameln
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.