フォルダ内のファイルの変更を監視する

フォルダ内のファイルの変更を監視する

ファイルの作成、削除、および変更についてフォルダを監視するスクリプトを作成しています。これらの条件のいずれかが発生すると、ユーザーに通知が送信されます(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

関連情報