web-dev-qa-db-ja.com

ディレクトリの内容が更新されたときにコマンドを実行するにはどうすればよいですか?

他の人によって内容が頻繁に変更されるディレクトリAがあります。

個人用ディレクトリBを作成しました。ここには、これまでAにあったすべてのファイルを保存します。

現在、たまにrsyncを実行して、ファイルをAからBにバックアップしています。ただし、一部のファイルがAに追加され、Aから削除されてから、Bにコピーする機会が得られる可能性を恐れています。

これを防ぐための最良の方法は何ですか?理想的には、Aの内容が変更されるたびに現在のバックアップスクリプトを実行したいのですが。

28
oadams

inotify-tools がインストールされている場合は、inotifywaitを使用して、ファイルまたはディレクトリが次の場所に書き込まれた場合にアクションをトリガーできます。

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

どこ -qqスイッチは完全に無音、-rは再帰的(必要な場合)であり、-eは監視するイベントで、この場合はmodifyです。から man inotifywait

修正
監視されたファイルまたは監視されたディレクトリ内のファイルが書き込まれました。
29
jasonwryan

ファイルが変更されたときに任意のコマンドを実行できる entr コマンドラインツールを試してください。 2.9リリース以降、ディレクトリ監視オプション(-d)は、新しいファイルがディレクトリに追加されたときにイベントに反応するために追加されました。

プロジェクトに新しいファイルが追加された場合にユーティリティを実行する例:

$ while true; do
> echo src/* | entr -d your_command
> done

ディレクトリ監視モードでは、各ファイルの親ディレクトリが監視リストに暗黙的に追加されます。

これの唯一の意味は、新しいファイルが表示された場合、外部シェルループがファイルシステムを再スキャンできるように、ファイルを終了する必要があることです。

以下は、ディレクトリ監視オプションなしのバージョンです。

$ while true; do
> echo src/* src | entr your_command
> done

ニーズに応じた簡単な例を次に示します。

$ ls -d * | entr sh -c 'rsync -vuar A B'

詳細: entrproject.org または eradman.com/entrproject Webサイトを確認してください。

6
kenorb

厳密に言うと、誰かがファイルをドロップしてすぐに削除すると、見落とす可能性があります。 inotify (Linuxの場合、または他のuniceの場合の同様の機能)を使用すると、リスクウィンドウが小さくなります。

選択したファイルシステムをそのディレクトリにマウントできる場合(これはオプションではないかもしれません)、すべてのファイルバージョンを記録するファイルシステムを配置できます(例: copyfs )。

あなたが探しているプログラムは inotify です。

3
Kevin