有一个文件会一直更新,但更新频率不能确定。如果要使用脚本或工具实现,当文件变化的时候,输出当前时间和文件的Hash值,该如何实现?

脚本使用环境:Windows 用 Powershell
Linux 用 shell或python都可


#!/bin/bash
# 检测的文件
package=/data/file.index
# 记录 md5值的文件
md5=package_md5
# 创建新的md5信息
package_md5_new=$(md5sum -b $package | awk '{print $1}'|sed 's/ //g')

# 创建md5的函数
function creatmd5()
{
        echo $package_md5_new > $md5
}

# 判断文件是否存在
if [ ! -f $md5 ] ; then
        echo "md5file is not exsit,create md5file......."
        creatmd5
        exit
fi

# 读取旧的md5信息
package_md5_old=$(cat $md5|sed 's/ //g')

echo $package_md5_new
echo $package_md5_old

# 对象对比判断
if [ "$package_md5_new" == "$package_md5_old" ];then
        echo "md5 is not changed"
        docker restart saas
else
        echo "md5 is  changed"
        creatmd5
        bash ~/fabu.sh
fi




用python 写了简单的

# -*- coding:utf-8 -*-

import hashlib
from os import path,_exit
import time


def checkexists(file):
    if path.exists(file):
        return True
    else:
        return False


def filesave(file, data):
    with open(file, 'w') as f:
        f.write(data)


def filehash(file):
    if checkexists(file):
        filehash = hashlib.md5()
        with open(file, 'rb') as f:
            data = f.read()
        filehash.update(data)
        hashdata = filehash.hexdigest()
        if not checkexists('result.txt'):
            filesave('result.txt', hashdata)
        else:
            with open('result.txt', 'r') as data:
                readdata = data.read()
            if filehash.hexdigest() != readdata:
                print('文件已变化', '\n时间:', time.strftime("%Y-%m-%d %X", time.localtime()), '\nhash值:', hashdata)
                filesave('result.txt', hashdata)
    else:
        print('file is not exist')
        _exit(0)


if __name__ == '__main__':
    file = 'D:\\vs5ftp.txt'
    while True:
        filehash(file)
        time.sleep(10)

程序可以监听文件夹和文件的变化,这个监听的能力是操作系统通知的,只要这个监听的程序不挂,文件一变化,程序就能立马知道,然后计算hash值即可。

你把这个当前Hash值存在一个INI配置文件或随便什么文件、数据库都行
创建一个日志文件、或者数据库创建一个日志表也可以。
用个timer隔一段时间获取文件Hash值
获取的Hash值与存储的Hash值对比,如果Hash值不一样,输出当前时间和最新Hash值到日志文件。
同时更新最新Hash值到INI配置文件或随便什么文件、数据库。

可以参照工控上plc的方式,数据一直在采集,周期0.1s甚至更短,加个文件变化的判断条件,条件成立就输出hash值和当前时间,不成立就不输出,采集数据如果不需要记录,可以用覆盖保存就好了

刚好需要 谢谢