我需要在Linux系统上生成自上一次列表生成以来修改过的文件列表。我需要在用户空间上这样做,所以像法姆这样的解决方案不适合我。要做到这一点,我有以下一些限制:
ext2和ext3文件系统。有人知道这个任务已经实现的解决方案了吗?为此,我尝试使用rsync,但rsync似乎需要所有文件的副本来计算差异。
编辑
基本上,我需要一种机制,在给定的目录下递归地对文件列表及其增量进行分类,并与前面的目录进行比较。它可以使用文件大小来生成差异,或者更好地使用差分算法(类似于rsync算法)。但是,像MD5和SHA1这样的密码散列算法并不适合我,因为它们的性能不同。请不要说我有成千上万的文件,这不是加密的情况。
实时解决方案或需要在内核上进行更改的解决方案(如inotify、kqueue、法姆、保险丝)也不适合我。
谢谢。
发布于 2011-11-09 17:02:48
inotify工具来监视文件系统。不确定是否已经有这样的工具,但是快速搜索提供了很多结果,例如https://github.com/rvoicilas/inotify-tools/wiki/。md5sum来完成以下操作:
find / -xdev -type f -print0 | xargs -0 md5sum -b >> /tmp/sums.txt
现在,您可以对这些文件进行排序并进行比较,以检测差异:
sort -k 2 < /tmp/sums.txt > /tmp/sums.sorted.txt
我认为您理解这个想法,但是当然这需要大量的时间,因为您正在检查所有的数据。编辑:我已经编写了一个快速脚本来转储文件系统树,并将文件大小附加到文件名中。您可以使用diff对两次运行的输出进行比较,以确定已更改的内容。当然,这只是一个剪刀,可以改进。
#!/usr/bin/env python
import os
import sys
# initialize variables.
entries=[]
if len(sys.argv) > 1:
rootdir=os.path.normpath(sys.argv[1])
else:
rootdir=os.curdir
# walk filesystem tree.
for root, dirs, files in os.walk(rootdir):
for name in sorted(files):
fullname=os.path.normpath(os.path.join(root, name))
if os.path.islink(fullname) or not os.path.isfile(fullname):
entries.append(fullname)
else:
st=os.stat(fullname)
entries.append("%s %d" % (fullname, st.st_size))
for name in sorted(dirs):
entries.append(os.path.normpath(os.path.join(root, name)))
# print sorted list of found filesystem entries.
for entry in sorted(entries):
print entry这对你有帮助吗?
建议的改进:
f blub 6或d test,以查找已更改的文件类型。st_mtime/st_atime/st_ctime附加到文件中,以便根据时间检测文件更改。我希望这些建议能帮助你创造一个很酷的工具;-)
发布于 2011-11-09 16:58:48
如果您对每次运行重新计算每个文件的校验和感到满意,可以使用以下简单解决方案:
find / ( -not -path '/tmp/*' -and -type f ) -print0 | xargs -0 md5sum > /tmp/current-listing
diff /tmp/old-listing /tmp/current-listing
mv /tmp/current-listing /tmp/old-listing发布于 2011-11-09 16:58:07
你可以看看
rdiffbackup和r快照是基于rsync的完整增量(分层)备份解决方案。
您也可能在zfs或zfsonlinux中有很多用途。这些文件系统支持连续的快照:
SNAPID=$RANDOM # something unique, please
zfs snapshot tank/volume_of_mount@$SNAPID
zfs send -i tank/volume_or_mount@previous tank/volume_of_mount@$SNAPID |
pbzip2 > dumpfile.$SNAPID.bz2接收端:
zfs receive -vFdn tank2/into_this@$SNAPID < dumpfile.$SNAPID.bz2这种快照可以实时、实时地完成,并且执行得很好,因为ZFS是一个日志结构文件系统,具有内置的基于merkel树的完整性检查。
https://stackoverflow.com/questions/8068524
复制相似问题