在 Linux 上,有什么方法比“find”或“diff -r”更快捷地查看目录内的内容是否发生了变化?

在 Linux 上,有什么方法比“find”或“diff -r”更快捷地查看目录内的内容是否发生了变化?

我用来tar创建服务器上文件系统不同部分的快照,然后通过 ftp 将该快照传输到异地位置进行存档。

我希望只在发生更改时启动该操作。有些备份针对所有很少更改的系统文件夹运行(即安装新软件或修改配置时)。

每当发生更改时,我都想要一个完整的快照。我可以使用 生成已修改文件的列表find,但我实际上只需要知道该列表的长度是否为 0 或更大。使用 find 太慢了。

我知道有增量备份,而且我已经在其他情况下将 rsync 与 ZFS 结合使用。但是,这里的备份主机是 FTP 服务器(因此没有 rsync),我需要完整备份(因为备份存档用作恢复或克隆服务器的映像),并且我想要压缩输出(因此 tar 很方便)。

编辑:请注意,我不是寻找增量备份(我有这个),而是寻找一种快速(这有点排除 find 之类的)和简单的方法来决定完整快照是否与上一个快照相同。也许我的措辞不太好。我现在编辑了标题。

答案1

GNU find 的最新版本具有操作“-quit”,它会导致 find 立即停止搜索:

— 操作:-quit

立即退出(如果没有发生错误,则返回值为零)。这与“-prune”不同,因为“-prune”仅适用于已修剪目录的内容,而“-quit”只是使 find 立即停止。不会有任何子进程继续运行,但不会处理命令行上指定的其他文件。例如,find /tmp/foo /tmp/bar -print -quit 将仅打印“/tmp/foo”。在退出程序之前,将调用由“-exec ... +”或“-execdir ... +”构建的任何命令行。

您可以使用 find 表达式来查找已更改的文件,并在找到文件后立即使用 -quit 停止。这应该比 find 继续扫描更快。

-quit 已添加到 fileutils V4.2.3

答案2

GNU tar 有一个 --newer-mtime 选项,它需要一个日期参数,该参数可能是您上次备份的时间。根据您想要恢复文件系统的工作量,这可能是最后一次完整备份,在这种情况下,您需要恢复完整转储和最后一次每日转储,或者您可以从上次增量备份开始执行此操作,在这种情况下,您需要恢复完整转储和之后的每个转储。

此选项确实依赖于文件的修改时间戳,因此如果该时间戳已被明确更改,则您的备份可能会错过它。

答案3

因克龙实用程序使用 inotify 在发生文件系统事件时运行命令。配置文件类似于 crontab,但您指定的不是时间,而是路径和事件。

该命令可以是您的备份脚本(在这种情况下,备份将在文件修改后立即启动),或者您可以让它创建某个文件,然后让备份脚本检查该文件是否存在,然后将其删除。如果该文件存在,则表明自上次运行以来发生了某个事件。

答案4

这是一个有点疯狂的想法,但你可以用 md5sum 和 ls 稍微玩一下。

这个想法是只查看一个文件的 md5sum,并且该文件是您正在查看的目录的文件列表。只要没有任何变化,md5sum 就相同。但如果更新了时间戳,md5sum 就会改变,您就知道需要执行新的 tar 并将其发送到您的 ftp 服务器。

我们可以从这样的事情开始

ls -lR /path/to/dir/ | md5sum > file_list.txt.md5

然后你需要添加旧 md5 与当前 md5 之间的比较...等等

/约翰

相关内容