Mac에 "watch"또는 "inotifywait"와 같은 명령이 있습니까?


287

Mac (Snow Leopard)에서 폴더를보고 스크립트를 실행합니다 (폴더로 이동 한 파일 이름 (매개 변수 ... x.sh "filename")).

bash (x.sh)로 작성된 스크립트를 사용하여 입력 파일 1 달러에 일부 파일 및 기타 항목을 이동할 수 있습니다. 새 파일 / 폴더가 dir로 이동 / 생성 될 때 파일 이름을 지정하려면 OSX가 필요합니다.

그런 명령이 있습니까?


1
DropBox가 사용 가능한 모든 옵션을 시도한 이후 DropBox가 어떻게 작동하는지 묻습니다.
Jeff Burdges

2
@JeffBurdges 나는 그것이 쉬운 일인지 확신 할 수 없다. 그러나 Apple의 FSEvents Reference를 살펴본 후 Dropbox가 이것을 사용하지 않으면 실제로 어리석은 것이라고 말합니다 . fswatch답은 아래에 실제로 사용이 방법에서와 같이 폴더의 유틸리티 제시.
Steven Lu

답변:


447

fswatch

fswatch 는 Mac OS X FSEvents API를 사용하여 디렉토리를 모니터링하는 작은 프로그램입니다. 해당 디렉토리 변경에 대한 이벤트가 수신되면 지정된 쉘 명령이 다음과 같이 실행됩니다./bin/bash

GNU / Linux를 사용하는 경우, inotifywatch ( inotify-tools대부분의 배포판 에서 패키지의 일부 )는 비슷한 기능을 제공합니다.

업데이트 : fswatch 이제 BSD, Debian 및 Windows를 포함한 많은 플랫폼에서 사용할 수 있습니다.

구문 / 간단한 예

버전 1.x 이상에서 여러 경로를 볼 수있는 새로운 방법 :

fswatch -o ~/path/to/watch | xargs -n1 -I{} ~/script/to/run/when/files/change.sh

참고 :에 의해 출력 되지 않은 경우에 의해 출력 된 숫자 -oxargs명령 끝에 추가됩니다 -I{}. 해당 번호를 사용하기로 선택한 경우 {}명령의 아무 곳에 나 배치 하십시오.

버전 0.x 의 이전 방법 :

fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh

Homebrew를 사용한 설치

13/12/13 현재 홈 브루 에 다시 추가되었습니다 . 따라서 수식 목록 ( brew update)을 업데이트 하면 다음과 같이하면됩니다.

brew install fswatch

Homebrew없이 설치

이 명령을 입력하십시오 Terminal.app

cd /tmp
git clone https://github.com/alandipert/fswatch
cd fswatch/
make
cp fswatch /usr/local/bin/fswatch

c시스템에 컴파일러 가없는 경우 Xcode 또는 Xcode 명령 행 도구를 모두 설치해야합니다 (둘 다 무료). 그러나이 경우 homebrew를 확인하십시오 .

fswatch버전 1.x에 대한 추가 옵션

Usage:
fswatch [OPTION] ... path ...

Options:
 -0, --print0          Use the ASCII NUL character (0) as line separator.
 -1, --one-event       Exit fsw after the first set of events is received.
 -e, --exclude=REGEX   Exclude paths matching REGEX.
 -E, --extended        Use exended regular expressions.
 -f, --format-time     Print the event time using the specified format.
 -h, --help            Show this message.
 -i, --insensitive     Use case insensitive regular expressions.
 -k, --kqueue          Use the kqueue monitor.
 -l, --latency=DOUBLE  Set the latency.
 -L, --follow-links    Follow symbolic links.
 -n, --numeric         Print a numeric event mask.
 -o, --one-per-batch   Print a single message with the number of change events.
                       in the current batch.
 -p, --poll            Use the poll monitor.
 -r, --recursive       Recurse subdirectories.
 -t, --timestamp       Print the event timestamp.
 -u, --utc-time        Print the event time as UTC time.
 -v, --verbose         Print verbose output.
 -x, --event-flags     Print the event flags.

See the man page for more information.

homebrew없이 설치하거나 설치해도 더 이상 작동하지 않는 것 같습니다. make메이크 파일을 찾지 못하면 오류가 발생합니다. 다행스럽게도 fswatch는 이제 MacPorts에 있으므로 sudo port install fswatchHomebrew 대신 MacPorts를 사용하는 사람들에게 적합합니다.
coredumperror 2019

정적 인수가있는 명령을 사용하는 경우 (예 : src에서 유닛 테스트를 실행하고 변경 사항을 테스트하고 있음) 이것이 작동하지 않을 수 있습니다. 이 질문 ( stackoverflow.com/questions/25689589/… )은 내가 필요한 두 번째 작품이었습니다.
jskulski

5
나는 당신의 말을 들었습니다 :fswatch ./ | xargs -I{} cp {} ~/Dropbox/backup/latest/
fionbio

fswatch는 entr 또는 when_changed와 같은 도구보다 낫습니다. .git 디렉토리를 처리 할 때 약간의 버그가 있습니다. fswatch는 훨씬 더 전문적입니다. 간단히, 당신은 단지 fswatch .현재 디렉토리를 모니터링 할 것입니다.
익명

나는 제안 fswatch -0 -v -o /path/to/watched/files | xargs -0 -n 1 -I {} [your command]-0NULL을합니다. 이것은 덜 컴파일을 위해 저에게 효과적입니다
boldnik

95

그 목적으로 launchd 를 사용할 수 있습니다 . 파일 경로가 수정 될 때 자동으로 프로그램을 시작하도록 Launchd를 구성 할 수 있습니다.

예를 들어 다음과 같이 실행 된 구성 plist는 /usr/bin/logger내 사용자 계정의 데스크탑 폴더가 수정 될 때 프로그램을 시작합니다 .

<?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>logger</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/logger</string>
        <string>path modified</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Users/sakra/Desktop/</string>
    </array>
</dict>
</plist>

구성 plist를 활성화하려면 라이브러리 폴더의 LaunchAgents 폴더에 "logger.plist"로 저장하십시오.

쉘에서 다음 명령 launchctl을 사용하여 logger.plist를 활성화 할 수 있습니다 .

$ launchctl load ~/Library/LaunchAgents/logger.plist

데스크탑 폴더가 모니터되고 있습니다. 변경 될 때마다 system.log에 출력이 표시됩니다 (Console.app 사용). logger.plist를 비활성화하려면 다음을 실행하십시오.

$ launchctl unload ~/Library/LaunchAgents/logger.plist

위의 구성 파일은 WatchPaths옵션을 사용합니다 . 또는 QueueDirectories옵션 을 사용할 수도 있습니다 . 자세한 내용은 시작된 매뉴얼 페이지를 참조하십시오.


1
파일 경로뿐만 아니라 파일 내용의 변경 사항을 모니터링하는 방법이 있습니까?
Cam

2
나는 그렇게 생각하지 않습니다. 그러한 목적으로 opensnoop 을 사용할 수 있습니다 .
sakra

1
나는 이것을 작동 시켰지만 /usr/bin/loggerBash 스크립트 로 전환 하고 "<string>path modified</strong>"항목을 제거 했을 때 내 bash 스크립트가 데스크탑의 어떤 파일이 수정되었는지 알 수있는 방법을 찾을 수 없었습니다. 이벤트 만 발생했습니다. 내가보고 시도 $0, $1만에 전달 지적, 스크립트 이름 자체를 얻었다.
Volomike

또한 변경 사항을 감지했을 때만 시작하고 중지하는 대신 변경 사항을 감지하면 루프에 들어가나요? 예를 들어 2 일 전에 데스크탑에서 변경된 내용이 있음을 알려주는 루프에서 계속 실행되지 않고 필요에 따라 작동하고 싶습니다. 로그에 반복해서 기록합니다. 이 plist에 어떤 종류의 간격 옵션을 사용해야합니까?
Volomike

위대한 일과 설명
ChenSmile

37

Homebrew를 통해 사용 가능한 Facebook의 파수꾼 도 멋지게 보입니다. 필터링도 지원합니다.

이 두 줄은 소스 디렉토리에서 감시를 설정 한 다음 CSS 파일이 변경 될 때마다 "minify-css"라는 도구를 실행하는 "buildme"라는 트리거를 설정합니다. 이 도구에는 변경된 파일 이름 목록이 전달됩니다.

$ watchman watch ~/src

$ watchman -- trigger ~/src buildme '*.css' -- minify-css

경로는 절대적이어야합니다.


1
이것은 지금까지 가장 좋은 도구입니다.
BentOnCoding

1
이것은 매우 멋진 작은 프로그램입니다. 문서는 훌륭하고 무한 루프를 열지 않으며 (fswatch 가하는 것처럼 보입니다) 재부팅 후 작성한 시계를 기억하고 자동으로 다시 시작합니다.
Brad

21

내 작은 도구를 살펴보고 확장하고 싶을 수도 있습니다 kqwait. 현재는 단일 파일에서 쓰기 이벤트를 기다리는 중이지만 kqueue 아키텍처는 계층 적 이벤트 스태킹을 허용합니다 ...


지금까지 산 사자에서 작동합니다. 아주 좋아요!
Scott

실제로 이것은 정말 대단합니다. 나는 약간의 문제에 부딪쳤다. fswatch(그런 가벼운 래퍼이기 때문에 올바른 일을하기 위해 수정 될 수있다.)와 같은 것들을 실행할 때 발생하는 곳 git status(실제로 zsh마다 실행될 때) 프롬프트는 내 컴퓨터에서 렌더링됩니다 ...) 실제로 끝없는 피드백 루프를 만들어서이 정교한 스크립트를 망칩니다. 그러나 kqwait는 변경된 파일에 대한 정보를 제공하며에 의해 트립되지 않습니다 git status. 글을 쓰려면 발사해야합니다.
Steven Lu

2
$ brew install kqwait && while true; do kqwait doc/my_file.md; make; done
Joshua Cook

15

watchdog 은 파일 / 디렉토리를 감시하기위한 크로스 플랫폼 파이썬 API이며, 이벤트가 발생할 때 (새로 추가 된 파일, 제거 된 파일 및 변경된 파일을 포함하여) 조치 (쉘 명령 포함)를 트리거 할 수있는 "트릭"도구가 내장되어 있습니다.


7

이것은 파일이 변경 될 때 임의의 명령을 실행하는 OSX의 대안으로 entr 을 언급 한 것입니다. 나는 그것이 간단하고 유용하다는 것을 알았습니다.



3

편집 : fsw 에 병합되었습니다 fswatch. 이 답변에서에 대한 참조 fsw는 이제이어야합니다 fswatch.

나는 fswatchC ++로 fsw몇 가지 개선 된 기능을 갖춘 대체 프로그램을 작성했습니다 .

  • 지원되는 모든 플랫폼 (OS X v.> = 10.6)에서 빌드하는 GNU 빌드 시스템 프로젝트입니다.

    ./configure && make && sudo make install
    
  • 여러 경로를 다른 인수로 전달할 수 있습니다.

    fsw file-0 ... file-n 
    
  • 다음과 같은 모든 이벤트 정보가 포함 된 자세한 레코드를 덤프합니다.

    Sat Feb 15 00:53:45 2014 - /path/to/file:inodeMetaMod modified isFile 
    
  • 출력을 구문 분석하기 쉽기 때문에 fsw출력을 다른 프로세스로 파이프 할 수 있습니다.

  • 대기 시간은로 사용자 지정할 수 있습니다 -l, --latency.
  • 로 문자형 문자 대신 숫자 형 이벤트 플래그를 작성할 수 있습니다 -n, --numeric.
  • strftime형식 문자열을 사용하여 시간 형식을 사용자 지정할 수 있습니다 -t, --time-format.
  • 시간은 머신 의 현지 시간 (기본값) 또는 UTC 시간 ()을 사용할 수 -u, --utc-time있습니다.

fsw 받기 :

fsw되어 GitHub의에서 호스팅 하고 저장소를 복제 얻을 수 있습니다 :

    git clone https://github.com/emcrisostomo/fsw

fsw 설치 :

fsw 다음 명령을 사용하여 설치할 수 있습니다.

    ./configure && make && sudo make install

추가 정보 :

또한 작동 방식 에 대한 몇 가지 예를 찾을 수 있는 소개 블로그 게시물을 작성했습니다 fsw.


2

Apple OSX 폴더 동작을 사용하면 폴더 에서 수행 한 동작을 기반으로 작업을 자동화 할 수 있습니다.


9
그래, 나는 그것을 여러 번 사용하려고했지만 결코 성공적으로 작동하지 않았습니다. 예를 들어 주시겠습니까?
Mint

1
즉하지 대답 링크,의
댄 Rosenstark는

2

fswatch 포크는 구문 분석 친화적 인 출력 inotifywait -m으로 약간 적은 기능을 제공합니다 (기다리지 않아도됩니다! Linux에서 더 많은 문제가 있습니다 inotifywait...).

원본을 개선 한 fswatch것입니다. 포크로 변환 한 프로그램을 제공하지 않고 STDOUT을 통해 변경된 파일의 실제 경로를 전송하기 때문입니다.

내가 물건을 자동화하는 데 사용하는 일련의 무서운 bash 스크립트의 기초로 견고했습니다.

inotifywait반면에 Linux에서는 ( 주제 에 맞지 않습니다. ) 리눅스 위에 많은 kludges가 필요하며 여전히 그것을 관리하는 좋은 방법을 찾지 못했습니다 node.js.


1
맞아요, fswatch의 포크. 가 브루에?
fatuhoku

1
내 대답은 아니오 야; 하지만 그들은 노력하고 있습니다 . 정말 빨리 설치하려면 brew install https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3/Library/Formula/fswatch.rb
fatuhoku

1

나는 이것에 대한 GIST를 가지고 있으며 사용법은 매우 간단합니다.

watchfiles <cmd> <paths...>

설명하기 위해 다음 명령을 메아리 Hello World마다 그 file1ORfile2 변경 . 기본 간격 확인은 1 초입니다.

watchfiles 'echo Hello World' /path/to/file1 /path/to/file2 

5 초마다 확인하려면 -t플래그를 사용할 수 있습니다

watchfiles -t 'echo Hello World' /path/to/file1 /path/to/file2 
  • -vverbose디버그 정보를 보여주는 모드를 활성화합니다
  • -q 만든다 watchfiles 실행 조용히 ( #사용자가 프로그램이 실행되는 볼 수 있도록 표시 될 것이다)
  • -qq 만든다 watchfiles 완전히 조용히 실행
  • -h 도움말과 사용법을 보여줍니다

https://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55


0

macOS 에서이 작업을 마쳤습니다. 나는 이것이 여러면에서 끔찍하다고 확신합니다.

#!/bin/sh
# watchAndRun
if [ $# -ne 2 ]; then
    echo "Use like this:"
    echo "   $0 filename-to-watch command-to-run"
    exit 1
fi
if which fswatch >/dev/null; then
    echo "Watching $1 and will run $2"
    while true; do fswatch --one-event $1 >/dev/null && $2; done
else
    echo "You might need to run: brew install fswatch"
fi

잠시 동안 fswatch 구문을 알아낼 수 없었습니다. 짜증나고 스크립트를 중지하기가 어렵습니다.
Dan Rosenstark 19

0

NodeJS를 사용하려면 시청에 chokidar (또는 실제로 chokidar-cli ) 라는 패키지 를 사용한 다음 rsync(Mac에 포함) 을 사용할 수 있습니다 .

재 동기화 명령 :

$ rsync -avz --exclude 'some-file' --exclude 'some-dir' './' '/my/destination'

Chokidar cli (npm을 통해 전 세계적으로 설치됨) :

chokidar \"**/*\" -c \"your-rsync-command-above\"


-3

다음은 watch3 초마다 명령을 실행하려는 명령 이없는 사용자를위한 간단한 단일 행 대안입니다 .

while :; do your-command; sleep 3; done

기본적으로 다음을 수행하는 것과 동일한 무한 루프입니다.

watch -n3 your-command


3
이것은 파일 시스템에서 이벤트를 수신하는 라이브러리를 사용하는 것과 다릅니다. 귀하의 예에서 your-command디스크 I / O를 수행하는 경우 3 초마다 또는 매시간 10,800 회 보장 된 디스크 읽기 / 쓰기 입니다. 파일 시스템 이벤트를 사용하면 I / O (및 기타 고가의 작업)는 파일을 변경할 때만 발생합니다 (일반적으로 한 시간에 몇 번만).
Noah Sussman

진실하고 고려하기 좋습니다. watch무엇을하고 있는지 알기 위해서는 일시적인 시간이 필요합니다 . 언급 한 기술을 프로덕션 앱 또는 이와 유사한 것에 사용하지 않습니다. 예를 들어의 진행 상황을보고 싶습니다. dd내 기술을 통해이를 수행 your-command할 수 있습니다 (적절한 신호를 (으 dd) 로 전송 ).
trusktr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.