回答:
inotifywait(inotify-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を使用します。
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を使用してファイルシステムイベントでスクリプトをトリガーする方法」を参照してください。
いくつかのディレクトリでは、これを行うことができます。
#!/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/