มีวิธีง่าย ๆ ในการเรียกใช้คำสั่ง (เทอร์มินัล) โดยอัตโนมัติทุกครั้งที่มีการเปลี่ยนแปลงไฟล์ในโฟลเดอร์เฉพาะหรือไม่?
สิ่งนี้ควรเป็นไปได้ผ่านทางบรรทัดคำสั่งหรือแอปพลิเคชันภายในระบบไม่มีแอปพลิเคชันของบุคคลที่สาม
ความคิดใด ๆ
มีวิธีง่าย ๆ ในการเรียกใช้คำสั่ง (เทอร์มินัล) โดยอัตโนมัติทุกครั้งที่มีการเปลี่ยนแปลงไฟล์ในโฟลเดอร์เฉพาะหรือไม่?
สิ่งนี้ควรเป็นไปได้ผ่านทางบรรทัดคำสั่งหรือแอปพลิเคชันภายในระบบไม่มีแอปพลิเคชันของบุคคลที่สาม
ความคิดใด ๆ
คำตอบ:
บันทึกรายการคุณสมบัติเช่นนี้เป็น~/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>
เอเจนต์สามารถโหลดด้วยlaunchctl load ~/Library/LaunchAgents/test.plist
หรือโดยล็อกเอาต์และย้อนกลับการใช้การเปลี่ยนแปลงจำเป็นต้องมีการยกเลิกการโหลดและโหลดเพลต
Tilde ส่วนขยาย ( ~/
) ทำงานใน WatchPaths ตามค่าเริ่มต้น EnableGlobbing เพิ่ม wildcard และส่วนขยาย tilde สำหรับ ProgramArguments แต่ไม่มีผลกับโปรแกรมหรือ WatchPaths
หากไฟล์ที่ถูกดูถูกแก้ไขภายในสิบวินาทีจากการเรียกใช้ล่าสุดข้อความเช่นนี้จะถูกเพิ่มไปยัง system.log:
com.apple.launchd.peruser.501[146]: (test) Throttling respawn: Will start in 7 seconds
วิธีหนึ่งในการกำจัดข้อความคือเพิ่มสิ่งที่ชอบsleep 10
ลงในสคริปต์ การตั้งค่า ThrottleInterval เป็น 10 ไม่ช่วยแก้ปัญหา
ไม่พบการเปลี่ยนแปลงในโฟลเดอร์ย่อยของโฟลเดอร์ที่จับตาดู
ดูman launchd
และman launchd.plist
สำหรับข้อมูลเพิ่มเติม
entr (1)เป็นโปรแกรมสำหรับเรียกใช้คำสั่งเมื่อไฟล์มีการเปลี่ยนแปลง มันอ่านรายชื่อของไฟล์ใน STDIN และใช้kqueue (2)เพื่อหลีกเลี่ยงการสำรวจ
ตัวอย่าง:
ls my_project/*.html | entr echo "file changed"
คุณสามารถใช้การทำงานของโฟลเดอร์ซึ่งอนุญาตให้คุณเรียกใช้งานสคริปต์ (Automator) เมื่อใดก็ตามที่เนื้อหาในโฟลเดอร์เปลี่ยนแปลง เท่าที่ฉันรู้ Automator มีเทมเพลตที่ช่วยให้คุณสร้างแอ็คชั่นโฟลเดอร์ใหม่และแนบกับโฟลเดอร์ที่ต้องการได้อย่างง่ายดาย และโดยการเพิ่มการกระทำ "Run Shell Script" คุณควรได้รับผลที่ต้องการ
การกระทำของโฟลเดอร์นั้นใช้ได้ดีสำหรับการกระตุ้นเมื่อมีการเพิ่มหรือแก้ไขไฟล์
อย่างไรก็ตามหากคำจำกัดความของการเปลี่ยนแปลงของคุณรวมถึงการลบไฟล์การกระทำของโฟลเดอร์ OSX จะไม่ตรวจพบว่าไฟล์ถูกลบไปแล้ว
ในการตอบคำถาม:
ดาวน์โหลดการพึ่งพา FileWatcher ได้จากที่นี่: https://github.com/eonist/swift-utils
ทำความคุ้นเคยกับการวิ่งอย่างรวดเร็วใน comandline: http://krakendev.io/blog/scripting-in-swift
ใช้รหัสนี้เพื่อดูโฟลเดอร์
รหัส:
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 มีประเภทของงานที่เรียกว่า "การกระทำโฟลเดอร์" ซึ่งจะทำงานโดยอัตโนมัติเมื่อมีการเพิ่มบางสิ่งในโฟลเดอร์ สร้างขึ้นหนึ่งรายการจากนั้นใช้คำสั่ง "Run Shell Script
คุณอาจต้องการลองสิ่งนี้:
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
ติดตามการเปลี่ยนแปลงของไฟล์เช่นกัน