web-dev-qa-db-ja.com

Macに「watch」や「inotifywait」などのコマンドはありますか?

Mac(Snow Leopard)上のフォルダーを監視してから、スクリプトを実行します(フォルダーに移動したばかりのファイル名を(パラメーターとして... x.sh "filename")与えます)。

入力b1でいくつかのファイルやその他のものを移動するbash(x.sh)で記述されたスクリプトがあります。新しいファイル/フォルダーがディレクトリに移動/作成されたときにファイル名を与えるにはOSXが必要です。

そのようなコマンドはありますか?

253
Mint

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

注:-oによって出力されない場合、-I{}によって出力される数値は、xargsコマンドの最後に追加されます。その番号を使用することを選択した場合は、コマンドの任意の場所に{}を配置してください。

バージョン0.xの古い方法:

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

Homebrewを使用したインストール

9/12/13の時点で homebrew -yay!したがって、数式リスト(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.
398
cwd

そのために launchd を使用できます。 Launchdは、ファイルパスが変更されたときにプログラムを自動的に起動するように構成できます。

たとえば、次のlaunchd config 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をアクティブにするには、「logger.plist」としてライブラリフォルダーのLaunchAgentsフォルダーに保存します。

シェルから、コマンドlaunchctlを使用して、次を実行してlogger.plistをアクティブ化できます。

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

これで、デスクトップフォルダが監視されています。変更されるたびに、system.logに出力が表示されます(Console.appを使用)。 logger.plistを無効にするには、次を実行します。

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

上記の設定ファイルはWatchPathsオプションを使用します。または、QueueDirectoriesオプションを使用することもできます。詳細については、 launchd manページを参照してください。

88
sakra

Facebookの watchman は、Homebrew経由でも利用可能で、見た目もいいです。フィルタリングもサポートしています:

これらの2行は、ソースディレクトリで監視を確立し、CSSファイルが変更されるたびに「minify-css」というツールを実行する「buildme」というトリガーを設定します。ツールには、変更されたファイル名のリストが渡されます。

$ watchman watch ~/src

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

パスは絶対パスでなければならないことに注意してください。

24
Jakub Holý

あなたは私の小さなツール kqwait を見て(そしておそらく拡張して)ください。現在、それはただ座って単一のファイルで書き込みイベントを待ちますが、 kqueue アーキテクチャは階層的なイベントスタッキングを可能にします...

21
sschober

watchdog は、ファイル/ディレクトリを監視するためのクロスプラットフォームpython AP​​Iであり、イベント発生時にアクション(シェルコマンドを含む)をトリガーできる組み込みの "トリック"ツールがあります(新しい追加ファイル、削除されたファイル、変更されたファイルなど)。

14
gfxmonk

これは、ファイルが変更されたときに任意のコマンドを実行するOSXの代替手段として entr に言及するだけです。シンプルで便利だと思います。

6
Donny Winston

sschobertool を使用したワンライナーです。

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

編集:fswfswatch にマージされました。この回答では、fswへの参照はすべてfswatchになります。

fswatchと呼ばれるfswの置換をC++で作成しました。

  • サポートされているプラ​​ットフォーム(OS X v。> = 10.6)でビルドするGNU Build Systemプロジェクトです。

    ./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を使用してカスタマイズできます。
  • 時間は、マシンのlocal時間(デフォルト)または-u, --utc-timeのUTC時間です。

Fswの取得:

fswGitHubでホスト であり、リポジトリのクローンを取得できます:

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

Fswのインストール:

fswは、次のコマンドを使用してインストールできます。

    ./configure && make && Sudo make install

さらに詳しい情報:

また、紹介文 ブログ投稿 を作成しました。ここでは、fswの動作に関するいくつかの例を見つけることができます。

これには要点があり、使い方はとても簡単です

watchfiles <cmd> <paths...>

たとえば、次のコマンドは、Hello World OR file1が変更されるたびにfile2をエコーし​​ます。デフォルトの間隔チェックは1秒です

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

5秒ごとに確認したい場合は、-tフラグを使用できます

watchfiles -t 'echo Hello World' /path/to/file1 /path/to/file2 
  • -vは、デバッグ情報を表示するverboseモードを有効にします
  • -qwatchfilesを静かに実行します(#が表示されるため、ユーザーはプログラムが実行中であることを確認できます)
  • -qqwatchfilesを完全に静かに実行します
  • -hはヘルプと使用法を示します

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

2
thiagoh

Apple OSX Folder Actions フォルダーで実行されたアクションに基づいてタスクを自動化できます。

2
Asaph

fswatch の私のフォークは、inotifywait -mの機能をわずかに少なくして提供します(待つ必要はありません。Linuxでinotifywait...を使用するとさらに多くの問題が発生します)。

元のfswatchを改良したものです。変更されたファイルの実際のパスをSTDOUT経由で送信するため、フォークするプログラムを提供する必要はありません。

ものを自動化するために使用する一連の恐ろしいbashスクリプトの基盤として堅実です。

(これはオフトピックです)一方、Linuxのinotifywaitは、その上に多くの工夫が必要であり、それを管理するための良い方法をまだ見つけていませんが、node.jsに基づくものがチケット。

2
Steven Lu

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
0
Dan Rosenstark