ファイルの観察とチェックサムの比較

ファイルの観察とチェックサムの比較

スクリプトを使用してファイルを観察し、60秒ごとにファイルのmd5sumを比較して変更された場合は、画面に警告を印刷してみてください。

何をすべきかわかりません。それが私が持っているのですが、少し外れたようです。

#/bin/bash

watch=$@

if [ -z "$watch" ]
    then
        echo "No file specified, aborting"
        exit 
else
    echo "watching : $watch"
fi

while [ 1 ]; do
watch -n 60 -d md5sum $watch
done

私もこれを行いましたが、うまくいくようです(一種の)。ファイルが変更されたかどうかを通知しますが、watchコマンドを使用しません。ウォッチでこれを行う方法はありますか?

#/bin/bash

watch=$@

if [ -z "$watch" ]
   then
       echo "No file specified, aborting"
       exit 
else
    echo "watching : $watch"
fi

checksum1="empty"
while [ 1 ]; do

checksum2=$(md5sum $watch | md5sum | cut -d ' ' -f1)
if [ "$checksum2" != "$checksum1" ];
then
echo "Warning : $watch has been changed"
#mail -s "$watch has been changed" "[email protected]"
echo -e "\a"
fi
checksum1="$checksum2"
sleep 60
done

ベストアンサー1

あなたははるかに良い状況にありますinotify、これはファイル監視という目的で作成されました。


編集する:リンクされた質問に対する回答をここにまとめます。

ファイルやディレクトリを監視する必要があるときはいつでも、inotifyはその操作に適したツールです。監視したいイベント(ファイルへのアクセス、変更、開く、閉じる、削除など)をinotifywaitに通知できます(man inotifywait詳細を見る)。

最初の方法は次のループです。

while inotifywait -e close_write myfile.py; do ./myfile.py; done

最大の欠点は、イベントを見逃すことができることです。より効率的なバージョンは次のとおりです。

inotifywait -mq --format '%e' /path/to/file |
while IFS= read -r events; do
  /path/to/script "$events"
done

この後者のバージョンでは、イベントを見逃すことはありません。パイプはイベントがキューに入っていることを確認します。ループが時間内に選択されていない場合は積み重ねられますが、欠落している項目はありません。


編集する:テキストファイルを追跡する場合は、強力なハッシュを使用してファイルを追跡するので、gitもお勧めします。以下はメインループのbash擬似コードですinotify

git status file     # Tells whether <file> was modified
if file was modified; then
    git commit -- file  # Add <file> to the repository
    keep only the last two versions of <file>
    print the warning message
fi

これをベースとして使用できます。たぶん、git出力を解析する必要があります。私はあなたに正しい方法を話すのに十分に使用していませんが、それがトリックを実行できるような直感があります;-)。

おすすめ記事