web-dev-qa-db-ja.com

複数のディレクトリ内のinotify-toolsを使用して、再帰的に新しいファイルを継続的に検出します

私はちょうどinotify-toolsをインストールしました。複数のディレクトリ内のnotify-toolsで新しいファイルを継続的に再帰的に検出し、postfixを使用してメールを送信したいと考えています。後置部分を使ってメールを送ることはおそらくできるでしょう。新しいファイルを検出しようとするときに、これに対処する最善の方法を見つけようとしています。一度に複数のファイルが追加されることがあります。

17
David Custer

inotifywaitinotify-tools の一部)は、目的を達成するための適切なツールであり、いくつかのファイルが同時に作成されるので、それらを検出します。

ここにサンプルスクリプトがあります:

#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
done

inotifywaitはこれらのオプションを使用します。

-mdirを無期限に監視します。このオプションを使用しない場合、新しいファイルが検出されると、スクリプトは終了します。

-rはファイルを再帰的に監視します(dirs /ファイルがたくさんある場合、新しく作成されたファイルを検出するのにしばらく時間がかかります)

-e createは、監視するイベントを指定するオプションであり、あなたの場合はcreate新しいファイルを処理する

-format '%w%f'は、/ complete/path/file.nameの形式でファイルを出力します

"$ {MONITORDIR}"は、以前に定義した監視するパスを含む変数です。

したがって、新しいファイルが作成された場合、inotifywaitはそれを検出し、出力を出力します(/complete/path/file.name)をパイプに、そしてwhileがその出力を変数NEWFILEに割り当てます。

Whileループの中に、ローカルMTAで正常に機能するmailxユーティリティを使用してメールをアドレスに送信する方法が表示されます(この場合) 、Postfix)。

複数のディレクトリを監視する場合、inotifywaitはそれを許可しませんが、2つのオプションがあります。監視するディレクトリごとにスクリプトを作成するか、スクリプト内に次のような関数を作成します。

#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"    

monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &
39
sahsanu

inotifywait を使用します。例:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

詳細と例については、記事を参照してください
inotify-toolsを使用してファイルシステムイベントでスクリプトをトリガーする方法

8
harrymc

いくつかのディレクトリでこれを行うことができます:

#!/bin/bash


monitor() {
  inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
  do
     echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
  done
          }


monitor &

ファイル/etc/default/inotifywait /etc/default/inotifywait内のフォルダのリストの例を次に示します

/home/user1
/path/to/folder2/
/some/path/
0