Pantau folder untuk perubahan, dan jalankan perintah saat perubahan terdeteksi

10

Apakah ada cara sederhana untuk secara otomatis menjalankan perintah (Terminal) setiap kali file diubah dalam folder tertentu?

Ini harus dimungkinkan melalui baris perintah, atau aplikasi bawaan sistem, tidak ada aplikasi pihak ketiga.

Ada ide?

Louis B.
sumber

Jawaban:

6

Simpan daftar properti seperti ini sebagai ~/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>

Agen dapat dimuat dengan launchctl load ~/Library/LaunchAgents/test.plistatau dengan logout dan kembali. Menerapkan perubahan memerlukan pembongkaran dan pemuatan daftar.

Ekspansi Tilde ( ~/) berfungsi di WatchPaths secara default. EnableGlobbing menambahkan perluasan wildcard dan tilde untuk ProgramArguments, tetapi itu tidak memengaruhi Program atau WatchPaths.

Jika file yang ditonton dimodifikasi dalam sepuluh detik dari doa terakhir, pesan seperti ini ditambahkan ke system.log:

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

Salah satu cara untuk menghilangkan pesan adalah menambahkan sesuatu seperti sleep 10ke akhir skrip. Mengatur ThrottleInterval ke 10 tidak membantu.

Perubahan dalam subfolder dari folder yang ditonton tidak terdeteksi.

Lihat man launchddan man launchd.plistuntuk informasi lebih lanjut.

Lri
sumber
5

entr (1) adalah utilitas untuk menjalankan perintah ketika file berubah. Bunyinya daftar file pada STDIN dan menggunakan kqueue (2) untuk menghindari polling.

Contoh:

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

Anda dapat menggunakan Tindakan Folder, yang memungkinkan Anda menjalankan skrip (Pengotomasi) setiap kali konten dalam folder berubah. Sejauh yang saya tahu, Automator memiliki templat yang memungkinkan Anda dengan mudah membuat tindakan folder baru dan melampirkannya ke folder yang diinginkan. Dan dengan menambahkan tindakan "Jalankan Shell Script", Anda seharusnya mendapatkan efek yang diinginkan.

xeophin
sumber
5
Terima kasih, tetapi tampaknya "Tindakan Folder" hanya dipicu ketika file ditambahkan ke folder, bukan ketika file yang ada diperiksa.
Louis B.
3

Tindakan folder baik untuk memicu ketika file ditambahkan atau diubah.

Namun, jika definisi Anda tentang perubahan termasuk menghapus file, tindakan Folder OSX tidak mendeteksi jika file telah dihapus.

Untuk menjawab pertanyaan:

  1. Unduh dependensi FileWatcher dari sini: https://github.com/eonist/swift-utils

  2. Biasakan diri Anda dengan menjalankan swift di comandline: http://krakendev.io/blog/scripting-in-swift

  3. Gunakan kode ini untuk menonton folder.

Kode:

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
}
eonist
sumber
1

Automator memiliki jenis alur kerja yang disebut "Aksi Folder" yang secara otomatis berjalan ketika ada sesuatu yang ditambahkan ke folder. Buat satu, lalu gunakan tindakan "Run Shell Script."

Timothy Mueller-Harder
sumber
4
Terima kasih, tetapi tampaknya "Tindakan Folder" hanya dipicu ketika file ditambahkan ke folder, bukan ketika file yang ada diperiksa.
Louis B.
Oh baiklah. Maaf.
Timothy Mueller-Harder
0

Anda mungkin ingin mencoba sesuatu seperti ini:

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
Holger von Ameln
sumber
Anda setidaknya ls -lperlu menangkap perubahan file juga.
nohillside
benar .... ketinggalan itu
Holger von Ameln