327

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

入力 $1 でいくつかのファイルやその他のものを移動するスクリプトをすべて bash (x.sh) で作成しました。新しいファイル/フォルダーがディレクトリに移動/作成されたときにファイル名を指定するために OSX が必要なだけです。

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

4

16 に答える 16

498

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 でのインストール

2013 年 9 月 12 日の時点で、 homebrewに追加されました。したがって、数式リスト ( 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

システムにコンパイラがない場合は、cXcode または 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.
于 2012-12-10T19:37:14.783 に答える
43

Homebrew から入手できるFacebook のwatchmanも見栄えがします。フィルタリングもサポートしています:

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

$ watchman watch ~/src

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

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

于 2014-04-07T08:33:19.073 に答える
23

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

于 2012-01-24T22:49:07.860 に答える
6

sschobertoolを使用したワンライナーを次に示します。

$ while true; do kqwait ./file-to-watch.js; script-to-execute.sh; done
于 2016-04-24T18:51:54.707 に答える
3

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

于 2009-10-04T06:16:29.893 に答える
3

編集: fswにマージされましfswatchた。この回答では、 への参照はすべて とfsw読む必要がありますfswatch

私は、いくつかの改善を特徴fswatchとする C++ と呼ばれる置換を作成しました。fsw

  • これは、サポートされているプラ​​ットフォーム (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
  • 時間は、マシンのローカル時間 (デフォルト) または UTC 時間 ( -u, --utc-time.

fsw の取得:

fswGitHubでホストされており、リポジトリのクローンを作成して取得できます。

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

fsw のインストール:

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

    ./configure && make && sudo make install

さらに詳しい情報:

また、紹介ブログ記事も書きました。そこでは、どのように機能するかについていくつかの例を見つけることができますfsw

于 2014-02-15T00:30:59.320 に答える
2

fswatchの私のフォークはinotifywait -m、わずかに少ない (待つ必要はありません! Linux では多くの問題を抱えていinotifywaitます ...) 解析しやすい出力での機能を提供します。

fswatchフォークするプログラムを提供する必要がなく、変更されたファイルの実際のパスを STDOUT 経由で送信するため、オリジナルよりも改善されています。

これは、自動化に使用する一連の恐ろしい bash スクリプトの基盤として堅実です。

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

于 2013-05-22T03:24:48.600 に答える
1

私はこれを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
于 2019-02-02T17:48:12.803 に答える
0

sudo fs_usage -f filesys | grep "おもしろいこと" ?

于 2021-09-16T14:28:42.947 に答える
-3

watch以下は、 3 秒ごとにコマンドを実行したいコマンドを持っていないユーザーのための単純な 1 行の代替手段です。

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

これは、基本的に次のことを行うのと同じ無限ループです。

watch -n3 your-command

于 2013-11-11T08:39:08.497 に答える