폴더 변경 사항을 모니터하고 변경 사항이 감지되면 명령을 실행하십시오.


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로그 아웃하거나 다시 로그인하여 로드 할 수 있습니다 . 변경 사항을 적용하려면 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 launchdman launchd.plist더 많은 정보를 얻을 수 있습니다.


6

entr (1) 은 파일이 변경 될 때 명령을 실행하기위한 유틸리티입니다. STDIN에서 파일 목록을 읽고 kqueue (2) 를 사용하여 폴링을 피합니다.

예:

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

3

폴더 작업을 사용하면 폴더의 내용이 변경 될 때마다 (자동화) 스크립트를 실행할 수 있습니다. 내가 아는 한 Automator에는 새 폴더 작업을 쉽게 만들고 원하는 폴더에 첨부 할 수있는 템플릿이 있습니다. "쉘 스크립트 실행"조치를 추가하면 원하는 효과를 얻을 수 있습니다.


5
감사합니다. 그러나 "폴더 작업"은 기존 파일을 확인할 때가 아니라 폴더에 파일을 추가 할 때만 트리거됩니다.
Louis B.

3

파일이 추가되거나 수정 될 때 폴더 작업이 트리거되기에 좋습니다.

그러나 변경된 정의에 파일 삭제가 포함 된 경우 OSX 폴더 조치는 파일이 제거되었는지 감지하지 않습니다.

질문에 대답하려면 :

  1. https://github.com/eonist/swift-utils 에서 FileWatcher 종속성을 다운로드하십시오.

  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에는 폴더에 무언가가 추가 될 때 자동으로 실행되는 "폴더 작업"이라는 워크 플로 유형이 있습니다. 하나를 작성한 다음 "쉘 스크립트 실행"조치를 사용하십시오.


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 폰 Ameln
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.