gpt4 book ai didi

python - 确定目录中是否添加、删除或修改了任何文件

转载 作者:太空狗 更新时间:2023-10-29 21:17:50 24 4
gpt4 key购买 nike

我正在尝试编写一个 Python 脚本来获取目录中所有文件的 md5sum(在 Linux 中)。我相信我已经在下面的代码中完成了。

我希望能够运行它以确保目录中的文件没有更改,也没有添加要删除的文件。

问题是,如果我对目录中的文件进行了更改,然后又将其更改回来。运行下面的函数我得到了不同的结果。 (虽然我把修改后的文件改回来了。

谁能解释一下。如果您能想到解决方法,请告诉我?

def get_dir_md5(dir_path):
"""Build a tar file of the directory and return its md5 sum"""
temp_tar_path = 'tests.tar'
t = tarfile.TarFile(temp_tar_path,mode='w')
t.add(dir_path)
t.close()

m = hashlib.md5()
m.update(open(temp_tar_path,'rb').read())
ret_str = m.hexdigest()

#delete tar file
os.remove(temp_tar_path)
return ret_str

编辑:正如这些优秀的人所回答的那样,看起来 tar 包含标题信息,如修改日期。使用 zip 或其他格式会有什么不同吗?

还有其他解决方法吗?

最佳答案

正如提到的其他答案,即使内容相同,由于 tar 元数据更改或文件顺序更改,两个 tar 文件也可能不同。您应该直接对文件数据运行校验和,对目录列表进行排序以确保它们始终处于相同的顺序。如果您想在校验和中包含一些元数据,请手动包含它。

使用 os.walk 的未测试示例:

import os
import os.path
def get_dir_md5(dir_root):
"""Build a tar file of the directory and return its md5 sum"""

hash = hashlib.md5()
for dirpath, dirnames, filenames in os.walk(dir_root, topdown=True):

dirnames.sort(key=os.path.normcase)
filenames.sort(key=os.path.normcase)

for filename in filenames:
filepath = os.path.join(dirpath, filename)

# If some metadata is required, add it to the checksum

# 1) filename (good idea)
# hash.update(os.path.normcase(os.path.relpath(filepath, dir_root))

# 2) mtime (possibly a bad idea)
# st = os.stat(filepath)
# hash.update(struct.pack('d', st.st_mtime))

# 3) size (good idea perhaps)
# hash.update(bytes(st.st_size))

f = open(filepath, 'rb')
for chunk in iter(lambda: f.read(65536), b''):
hash.update(chunk)

return hash.hexdigest()

关于python - 确定目录中是否添加、删除或修改了任何文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7325072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com