フォルダーの変更を監視し、変更が検出されたときにコマンドを実行する


10

特定のフォルダーでファイルが変更されるたびに(ターミナル)コマンドを自動的に実行する簡単な方法はありますか?

これは、コマンドラインまたはシステムに組み込まれたアプリケーションを介して可能であり、サードパーティのアプリケーションは不可能です。

何か案は?



回答:


6

次のようなプロパティリストを保存します~/Library/LaunchAgents/test.plist

<?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>test</string>
    <key>ProgramArguments</key>
    <array>
        <string>say</string>
        <string>yy</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>~/Desktop/</string>
    </array>
</dict>
</plist>

エージェントはlaunchctl load ~/Library/LaunchAgents/test.plist、ログアウトして、またはログアウトして再度ロードすることでロードできます。変更を適用するには、plistをアンロードしてロードする必要があります。

チルダ拡張(~/)は、デフォルトでWatchPathsで機能します。EnableGlobbingは、ProgramArgumentsにワイルドカードとチルダ拡張を追加しますが、プログラムまたはウォッチパスには影響しません。

監視されているファイルが最後の呼び出しから10秒以内に変更されると、次のようなメッセージがsystem.logに追加されます。

com.apple.launchd.peruser.501[146]: (test) Throttling respawn: Will start in 7 seconds

メッセージを取り除く1つの方法はsleep 10、スクリプトの最後に何かを追加することです。ThrottleIntervalを10に設定しても効果はありません。

監視フォルダーのサブフォルダーの変更は検出されません。

詳細についてはman launchd、およびman launchd.plistを参照してください。


5

entr(1)は、ファイルが変更されたときにコマンドを実行するためのユーティリティです。STDIN上のファイルのリストを読み取り、ポーリングを回避するためにkqueue(2)を使用します。

例:

ls my_project/*.html | entr echo "file changed"

3

フォルダアクションを使用すると、フォルダの内容が変更されるたびに(Automator)スクリプトを実行できます。私の知る限り、Automatorには、新しいフォルダアクションを簡単に作成して目的のフォルダに添付できるテンプレートがあります。また、「シェルスクリプトの実行」アクションを追加することで、目的の効果が得られるはずです。


5
ありがとうございます。「フォルダアクション」は、ファイルがフォルダに追加されたときにのみトリガーされ、既存のファイルがチェックされたときではないようです。
Louis B.

3

フォルダアクションは、ファイルが追加または変更されたときにトリガーするのに適しています。

ただし、変更の定義にファイルの削除が含まれている場合、OSXフォルダーアクションはファイルが削除されたかどうかを検出しません。

質問に答えるには:

  1. ここからFileWatcherの依存関係をダウンロードします。https//github.com/eonist/swift-utils

  2. コマンドラインで迅速に実行することで自分を理解します:http ://krakendev.io/blog/scripting-in-swift

  3. このコードを使用して、フォルダーを監視します。

コード:

var fileWatcher = FileWatcher(["~/Desktop/test/".tildePath])/*<---the fileWatcher instance must be scoped to your class*/

fileWatcher!.event = { event in
    Swift.print(self?.someVariable)//Outputs: a variable in your current class
    Swift.print(event.description)//Outputs: a description of the file change
}

1

Automatorには、「フォルダーアクション」と呼ばれるタイプのワークフローがあり、フォルダーに何かが追加されると自動的に実行されます。作成してから、「シェルスクリプトの実行」アクションを使用します。


4
ありがとうございます。「フォルダアクション」は、ファイルがフォルダに追加されたときにのみトリガーされ、既存のファイルがチェックされたときではないようです。
Louis B.

ああ、大丈夫。ごめんなさい。
Timothy Mueller-Harder

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.