특정 폴더에서 파일을 변경할 때마다 자동으로 (터미널) 명령을 실행하는 간단한 방법이 있습니까?
이는 타사 응용 프로그램이없는 명령 줄 또는 시스템 내장 응용 프로그램을 통해 가능해야합니다.
어떤 아이디어?
특정 폴더에서 파일을 변경할 때마다 자동으로 (터미널) 명령을 실행하는 간단한 방법이 있습니까?
이는 타사 응용 프로그램이없는 명령 줄 또는 시스템 내장 응용 프로그램을 통해 가능해야합니다.
어떤 아이디어?
답변:
다음과 같이 속성 목록을 저장하십시오 ~/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로그 아웃하거나 다시 로그인하여 로드 할 수 있습니다 . 변경 사항을 적용하려면 plist를 언로드하고로드해야합니다.
틸드 확장 ( ~/)은 기본적으로 WatchPaths에서 작동합니다. EnableGlobbing은 ProgramArguments에 와일드 카드 및 물결표 확장을 추가하지만 Program 또는 WatchPath에는 영향을 미치지 않습니다.
감시 된 파일이 마지막 호출 후 10 초 이내에 수정되면 다음과 같은 메시지가 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"
파일이 추가되거나 수정 될 때 폴더 작업이 트리거되기에 좋습니다.
그러나 변경된 정의에 파일 삭제가 포함 된 경우 OSX 폴더 조치는 파일이 제거되었는지 감지하지 않습니다.
질문에 대답하려면 :
https://github.com/eonist/swift-utils 에서 FileWatcher 종속성을 다운로드하십시오.
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에는 폴더에 무언가가 추가 될 때 자동으로 실행되는 "폴더 작업"이라는 워크 플로 유형이 있습니다. 하나를 작성한 다음 "쉘 스크립트 실행"조치를 사용하십시오.
다음과 같이 시도해 볼 수 있습니다.
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파일 변경 사항도 잡아야합니다.