ファイルの作成、削除、および変更についてフォルダを監視するスクリプトを作成しています。これらの条件のいずれかが発生すると、ユーザーに通知が送信されます(30秒ごと)。
現在、ループを使用してfor
ディレクトリ内のファイルを繰り返し、事前に生成されたファイルの配列と比較していますが、新しく追加されたファイルと変更されたファイルを区別することはできません。
私が使用するコードは次のとおりです。
start()
{
files=(~/Junk/*)
while true; do
loopstart=$(date +%s)
watcher
sleep 15
done
}
watcher()
{
ls -1 ~/Junk
echo -e "\n"
for f in ~/Junk/*; do
if [[ ! "${files[@]}" =~ "$f" ]]; then
echo -e "\n$f has been added"
else
last_modified=$(stat -c %Z "$f")
if [ $(($loopstart - $last_modified)) -le 15 ]; then
echo -e "\n$f has been changed"
fi
fi
done
for f in "${files[@]}"; do
if [ ! -e "$f" ]; then
echo -e "\n$f has been deleted"
fi
done
files=(~/Junk/*)
}
start_watcher
私はinotifyと他のシステムがソリューションを提供できることを知っています。ちょうどBash専用のソリューションが必要です。
答え1
次の出力を使用できます。
find . -mindepth 1 -maxdepth 1 -type f -printf '%C@ %T@ ' -ls
stat
これは、各ファイルを呼び出すよりもはるかに高速です(特に複数回)。奇妙なファイル名をよりよく処理する方法-printf
はとの組み合わせです。-ls
このようなことが起こらないと確信している場合は、次のものを使用できます。
-printf '%i %C@ %T@ %P'
代わりに。
注釈ノードで述べたように、インデックスノードはオブジェクトを識別します。 ctimeとmtimeは、ファイルデータまたはメタデータが記録されたかどうかを示します(実際に変更されたかどうかは不明です)。このデータを配列に書き込む必要があります。
find ... | while IFS= read ctime mtime inode dummy1 ... dummy9 rest; do ...
リングの形。
答え2
問題はスクリプトの最後にあります。修正を含むスクリプトを再公開します。
起動機能を実行しようとしているので、「start_watcher」を「start」に変更します。
答え3
Auditdをお試しください
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/chap-system_auditing
必要なディレクトリを監視するには
auditctl -w /path/to/dir -p wa -k CHANGED_ON_DIR