Programing

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

lottogame 2020. 3. 31. 08:11
반응형

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


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

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

그런 명령이 있습니까?


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.

그 목적으로 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옵션 을 사용할 수도 있습니다 . 자세한 내용은 시작된 매뉴얼 페이지를 참조하십시오.


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

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

$ watchman watch ~/src

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

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


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


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


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


편집 : 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.


여기에 사용하여 한 줄의 sschober도구 .

$ while true; do kqwait doc/my_file.md; make; done

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


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

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

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

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


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

watchfiles <cmd> <paths...>

예를 들어, 다음 명령은 OR이 변경 Hello World될 때마다 에코 됩니다 . 기본 간격 확인은 1 초입니다.file1file2

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


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

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

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

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

watch -n3 your-command

참고 URL : https://stackoverflow.com/questions/1515730/is-there-a-command-like-watch-or-inotifywait-on-the-mac

반응형