มอนิเตอร์โฟลเดอร์สำหรับการเปลี่ยนแปลงและรันคำสั่งเมื่อตรวจพบการเปลี่ยนแปลง


10

มีวิธีง่าย ๆ ในการเรียกใช้คำสั่ง (เทอร์มินัล) โดยอัตโนมัติทุกครั้งที่มีการเปลี่ยนแปลงไฟล์ในโฟลเดอร์เฉพาะหรือไม่?

สิ่งนี้ควรเป็นไปได้ผ่านทางบรรทัดคำสั่งหรือแอปพลิเคชันภายในระบบไม่มีแอปพลิเคชันของบุคคลที่สาม

ความคิดใด ๆ



คำตอบ:


6

บันทึกรายการคุณสมบัติเช่นนี้เป็น~/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สำหรับข้อมูลเพิ่มเติม


6

entr (1)เป็นโปรแกรมสำหรับเรียกใช้คำสั่งเมื่อไฟล์มีการเปลี่ยนแปลง มันอ่านรายชื่อของไฟล์ใน STDIN และใช้kqueue (2)เพื่อหลีกเลี่ยงการสำรวจ

ตัวอย่าง:

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

3

คุณสามารถใช้การทำงานของโฟลเดอร์ซึ่งอนุญาตให้คุณเรียกใช้งานสคริปต์ (Automator) เมื่อใดก็ตามที่เนื้อหาในโฟลเดอร์เปลี่ยนแปลง เท่าที่ฉันรู้ Automator มีเทมเพลตที่ช่วยให้คุณสร้างแอ็คชั่นโฟลเดอร์ใหม่และแนบกับโฟลเดอร์ที่ต้องการได้อย่างง่ายดาย และโดยการเพิ่มการกระทำ "Run Shell Script" คุณควรได้รับผลที่ต้องการ


5
ขอบคุณ แต่ปรากฏว่า "การทำงานของโฟลเดอร์" จะถูกเรียกใช้เฉพาะเมื่อไฟล์ถูกเพิ่มเข้าไปในโฟลเดอร์ไม่ใช่เมื่อมีการตรวจสอบไฟล์ที่มีอยู่
Louis B.

3

การกระทำของโฟลเดอร์นั้นใช้ได้ดีสำหรับการกระตุ้นเมื่อมีการเพิ่มหรือแก้ไขไฟล์

อย่างไรก็ตามหากคำจำกัดความของการเปลี่ยนแปลงของคุณรวมถึงการลบไฟล์การกระทำของโฟลเดอร์ OSX จะไม่ตรวจพบว่าไฟล์ถูกลบไปแล้ว

ในการตอบคำถาม:

  1. ดาวน์โหลดการพึ่งพา FileWatcher ได้จากที่นี่: https://github.com/eonist/swift-utils

  2. ทำความคุ้นเคยกับการวิ่งอย่างรวดเร็วใน comandline: http://krakendev.io/blog/scripting-in-swift

  3. ใช้รหัสนี้เพื่อดูโฟลเดอร์

รหัส:

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 มีประเภทของงานที่เรียกว่า "การกระทำโฟลเดอร์" ซึ่งจะทำงานโดยอัตโนมัติเมื่อมีการเพิ่มบางสิ่งในโฟลเดอร์ สร้างขึ้นหนึ่งรายการจากนั้นใช้คำสั่ง "Run Shell Script


4
ขอบคุณ แต่ปรากฏว่า "การทำงานของโฟลเดอร์" จะถูกเรียกใช้เฉพาะเมื่อไฟล์ถูกเพิ่มเข้าไปในโฟลเดอร์ไม่ใช่เมื่อมีการตรวจสอบไฟล์ที่มีอยู่
Louis B.

ตกลง. ขอโทษ
Timothy Mueller-Harder

0

คุณอาจต้องการลองสิ่งนี้:

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ติดตามการเปลี่ยนแปลงของไฟล์เช่นกัน
nohillside

ถูกต้อง .... พลาดไปแล้ว
Holger von Ameln
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.