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


17

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

回答:


39

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" "yourmail@addresshere.tld"
done

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

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

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

-e createは、監視するイベントを指定するオプションです。場合によっては、新しいファイルを処理するために作成する必要があります。

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

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

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

whileループ内では、mailxユーティリティを使用して自分のアドレスにメールを送信する方法が表示されます。これは、ローカルMTA(場合によっては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" "yourmail@addresshere.tld"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &

サンプルスクリプトで使用されているコマンドに関するいくつかの説明を追加するのを忘れていたため、回答を編集する理由があります。inotifywaitツールについては、opがinotify-toolsを使用しているため、言及せずに質問に答えることはできません。ちなみに、私はここの初心者なので、ネチケットに関して多くを学ぶ必要があるので、申し訳ありませんが私の答えがあなたのものと重なる場合は申し訳ありません。繰り返しますが、ごめんなさい。
-sahsanu

問題ありません。SUへようこそ。ネチケットについて学ぶことは、どこでも実際に定義されていないため、通常は難しい方法で行われます。
harrymc

4
@sahsanu私は全体の「ネチケット」について同意しません。一人一人がそこに独自の視点から質問に答えています。回答間に重複はなく、書き直された回答もありません。質問が非常に具体的である場合、回答がそのように異なることは不可能です。質問に詳細に答えてくれてありがとう。これは、あなたが知っている以上に、このすべてについて学んでいる私のような人にとって助けになりました。あなたは私を数え切れないほどの時間節約してくれました。
デビッドカスター


進化する環境でのネチケットは絶対に定義することはできません。このサイトでは、間違って書かれていない限り回答を複製しないのが慣例であり、それでも編集によって代わりに修正することをお勧めします。民主的なコミュニティでは、同意しないことは常にあなたの権利です。@sahsanuは、彼の台本を見せながら前回の回答を参照することで私の発言を避けることができたでしょう。それが私が彼の代わりにしたことであり、それが私のネチケットであり、私は他の人と共有すると信じています(もちろん全員と共有するわけではありません)。
harrymc

8

たとえば、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を使用してファイルシステムイベントでスクリプトをトリガーする方法」を参照してください。


1
誰かがこれを使用し、読み取りの変数を大文字に変換すると、while内でいくつかのコマンドを実行できなくなります。これは、$ PATH変数を上書きするためです。
サベージマン

2
独自の変数には、大文字の変数名を使用@Savagemanれ強く、このため正確に落胆。大文字の変数名はシステムで使用するために予約されています。独自の変数では小文字を使用する必要があります。
トリプリー

@tripleee情報をありがとう、大文字の変数はもう使用しません:)
サベージマン

0

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

#!/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" "yourmail@addresshere.tld"
  done
          }


monitor &

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

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