Mac(Snow Leopard)上のフォルダーを監視してから、スクリプトを実行します(フォルダーに移動したばかりのファイル名を(パラメーターとして... x.sh "filename")与えます)。
入力b1でいくつかのファイルやその他のものを移動するbash(x.sh)で記述されたスクリプトがあります。新しいファイル/フォルダーがディレクトリに移動/作成されたときにファイル名を与えるにはOSXが必要です。
そのようなコマンドはありますか?
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
9/12/13の時点で homebrew -yay!したがって、数式リスト(brew update
)を更新し、必要な作業は次のとおりです。
brew install fswatch
これらのコマンドを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は、ファイルパスが変更されたときにプログラムを自動的に起動するように構成できます。
たとえば、次の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ページを参照してください。
Facebookの watchman は、Homebrew経由でも利用可能で、見た目もいいです。フィルタリングもサポートしています:
これらの2行は、ソースディレクトリで監視を確立し、CSSファイルが変更されるたびに「minify-css」というツールを実行する「buildme」というトリガーを設定します。ツールには、変更されたファイル名のリストが渡されます。
$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
パスは絶対パスでなければならないことに注意してください。
watchdog は、ファイル/ディレクトリを監視するためのクロスプラットフォームpython APIであり、イベント発生時にアクション(シェルコマンドを含む)をトリガーできる組み込みの "トリック"ツールがあります(新しい追加ファイル、削除されたファイル、変更されたファイルなど)。
これは、ファイルが変更されたときに任意のコマンドを実行するOSXの代替手段として entr に言及するだけです。シンプルで便利だと思います。
編集:fsw
は fswatch
にマージされました。この回答では、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
を使用してカスタマイズできます。-u, --utc-time
のUTC時間です。Fswの取得:
fsw
は GitHubでホスト であり、リポジトリのクローンを取得できます:
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
モードを有効にします-q
はwatchfiles
を静かに実行します(#
が表示されるため、ユーザーはプログラムが実行中であることを確認できます)-qq
はwatchfiles
を完全に静かに実行します-h
はヘルプと使用法を示しますhttps://Gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
Apple OSX Folder Actions フォルダーで実行されたアクションに基づいてタスクを自動化できます。
fswatch の私のフォークは、inotifywait -m
の機能をわずかに少なくして提供します(待つ必要はありません。Linuxでinotifywait
...を使用するとさらに多くの問題が発生します)。
元のfswatch
を改良したものです。変更されたファイルの実際のパスをSTDOUT経由で送信するため、フォークするプログラムを提供する必要はありません。
ものを自動化するために使用する一連の恐ろしいbashスクリプトの基盤として堅実です。
(これはオフトピックです)一方、Linuxのinotifywait
は、その上に多くの工夫が必要であり、それを管理するための良い方法をまだ見つけていませんが、node.js
に基づくものがチケット。
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