特定のフォルダーでファイルが変更されるたびに(ターミナル)コマンドを自動的に実行する簡単な方法はありますか?
これは、コマンドラインまたはシステムに組み込まれたアプリケーションを介して可能であり、サードパーティのアプリケーションは不可能です。
何か案は?
特定のフォルダーでファイルが変更されるたびに(ターミナル)コマンドを自動的に実行する簡単な方法はありますか?
これは、コマンドラインまたはシステムに組み込まれたアプリケーションを介して可能であり、サードパーティのアプリケーションは不可能です。
何か案は?
回答:
次のようなプロパティリストを保存します~/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
を参照してください。
フォルダアクションは、ファイルが追加または変更されたときにトリガーするのに適しています。
ただし、変更の定義にファイルの削除が含まれている場合、OSXフォルダーアクションはファイルが削除されたかどうかを検出しません。
質問に答えるには:
ここからFileWatcherの依存関係をダウンロードします。https://github.com/eonist/swift-utils
コマンドラインで迅速に実行することで自分を理解します:http ://krakendev.io/blog/scripting-in-swift
このコードを使用して、フォルダーを監視します。
コード:
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
}
Automatorには、「フォルダーアクション」と呼ばれるタイプのワークフローがあり、フォルダーに何かが追加されると自動的に実行されます。作成してから、「シェルスクリプトの実行」アクションを使用します。
次のようなことを試してみてください:
touch /tmp/dirb.tmp
while true do
ls /thedirtocheck > /tmp/dira.tmp
diff /tmp/dira.tmp /tmp/dirb.tmp || echo "something changed"
cp /tmp/dira.tmp /tmp/dirb.tmp
sleep 100
done
ls -l
ファイルの変更もキャッチする必要があります。