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?
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?
Jawaban:
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.plist
atau 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 10
ke akhir skrip. Mengatur ThrottleInterval ke 10 tidak membantu.
Perubahan dalam subfolder dari folder yang ditonton tidak terdeteksi.
Lihat man launchd
dan man launchd.plist
untuk informasi lebih lanjut.
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"
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.
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:
Unduh dependensi FileWatcher dari sini: https://github.com/eonist/swift-utils
Biasakan diri Anda dengan menjalankan swift di comandline: http://krakendev.io/blog/scripting-in-swift
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
}
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."
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
ls -l
perlu menangkap perubahan file juga.