Theo dõi thư mục để thay đổi và chạy lệnh khi phát hiện thay đổi


10

Có cách nào đơn giản để tự động chạy lệnh (Terminal) mỗi khi tệp được thay đổi trong một thư mục cụ thể không?

Điều này có thể được thực hiện thông qua dòng lệnh hoặc ứng dụng tích hợp trong hệ thống, không có ứng dụng của bên thứ ba.

Có ý kiến ​​gì không?



Câu trả lời:


6

Lưu một danh sách tài sản như thế này như ~/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>

Các tác nhân có thể được tải với launchctl load ~/Library/LaunchAgents/test.plisthoặc bằng cách đăng xuất và đăng nhập lại. Áp dụng các thay đổi đòi hỏi phải dỡ và tải bản gốc.

Tilde mở rộng ( ~/) hoạt động trong WatchPaths theo mặc định. EnableGlobbing thêm bản mở rộng ký tự đại diện và dấu ngã cho ProgramArgument, nhưng nó không ảnh hưởng đến Chương trình hoặc WatchPath.

Nếu một tệp đã xem được sửa đổi trong vòng mười giây kể từ lần gọi cuối cùng, một thông báo như thế này sẽ được thêm vào system.log:

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

Một cách để loại bỏ các tin nhắn là thêm một cái gì đó sleep 10vào cuối tập lệnh. Đặt ThrptionInterval thành 10 không có ích.

Thay đổi trong các thư mục con của các thư mục đã xem không được phát hiện.

Xem man launchdman launchd.plistđể biết thêm thông tin.


5

entr (1) là một tiện ích để chạy các lệnh khi tập tin thay đổi. Nó đọc một danh sách các tập tin trên STDIN và sử dụng kqueue (2) để tránh bỏ phiếu.

Thí dụ:

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

3

Bạn có thể sử dụng Tác vụ thư mục, cho phép bạn thực thi tập lệnh (Trình tự động) bất cứ khi nào nội dung trong thư mục thay đổi. Theo tôi biết, Automator có một mẫu cho phép bạn dễ dàng tạo một hành động thư mục mới và đính kèm nó vào thư mục mong muốn. Và bằng cách thêm một hành động "Run Shell Script", bạn sẽ có được hiệu ứng mong muốn.


5
Cảm ơn, nhưng có vẻ như "Hành động thư mục" chỉ được kích hoạt khi một tệp được thêm vào thư mục, không phải khi một tệp hiện có được kiểm tra.
Louis B.

3

Các hành động thư mục là tốt để kích hoạt khi một tập tin được thêm hoặc sửa đổi.

Tuy nhiên, nếu định nghĩa thay đổi của bạn bao gồm xóa một tệp, các hành động Thư mục OSX sẽ không phát hiện nếu một tệp đã bị xóa.

Để trả lời câu hỏi:

  1. Tải xuống các phụ thuộc FileWatcher từ đây: https://github.com/eonist/swift-utils

  2. Tự làm quen với việc chạy nhanh trong comandline: http://krakendev.io/blog/scripting-in-swift

  3. Sử dụng mã này để xem một thư mục.

Mã số:

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 có một loại quy trình công việc gọi là "Thư mục hành động" tự động chạy khi một cái gì đó được thêm vào một thư mục. Tạo một cái, sau đó sử dụng hành động "Run Shell Script."


4
Cảm ơn, nhưng có vẻ như "Hành động thư mục" chỉ được kích hoạt khi một tệp được thêm vào thư mục, không phải khi một tệp hiện có được kiểm tra.
Louis B.

Ờ được rồi. Lấy làm tiếc.
Timothy Mueller-Harder

0

Bạn có thể muốn thử một cái gì đó như thế này:

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

Bạn cần ít nhất ls -lđể nắm bắt các thay đổi tập tin là tốt.
nohillside

đúng .... đã bỏ lỡ điều đó
Holger von Ameln
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.