AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 34987
Accepted
Hanno Fietz
Hanno Fietz
Asked: 2009-07-03 04:58:58 +0800 CST2009-07-03 04:58:58 +0800 CST 2009-07-03 04:58:58 +0800 CST

在 Linux 上,有什么比 `find` 或 `diff -r` 更快的方法来查看目录中的某些内容是否已更改?

  • 772

我使用tar在我的服务器上创建文件系统不同部分的快照,然后将该快照 ftp 到异地位置进行归档。

我只想在某些事情发生变化时开始该操作。一些备份在所有很少更改的系统文件夹上运行(即,当安装新软件或修改配置时)。

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

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

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

backup linux
  • 12 12 个回答
  • 1985 Views

12 个回答

  • Voted
  1. David Pashley
    2009-07-03T05:34:11+08:002009-07-03T05:34:11+08:00

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

    此选项确实依赖于文件上的修改时间戳,因此如果已明确更改,那么您的备份可能会丢失它。

    • 4
  2. Samuel Edwin Ward
    2012-04-10T05:18:59+08:002012-04-10T05:18:59+08:00

    当文件系统事件发生时, incron实用程序使用 inotify 运行命令。配置文件就像一个 crontab,但不是您指定路径和事件的时间。

    该命令可以是您的备份脚本(在这种情况下,备份将在文件修改后几乎立即开始),或者您可以让它创建一些文件,并让备份脚本检查该文件是否存在,然后将其删除。如果文件存在,则自上次运行以来发生的事件之一。

    • 3
  3. Andy
    2009-07-03T05:36:14+08:002009-07-03T05:36:14+08:00

    您始终可以将find的输出通过管道传输到wc并获取已更改文件的整数计数:

    find . -ctime 1 | wc -l
    

    虽然大卫的回答需要更少的代码更改:)

    • 2
  4. Johan
    2009-07-03T05:37:24+08:002009-07-03T05:37:24+08:00

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

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

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

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

    然后你需要在旧的 md5 和当前的......等等之间添加一个比较

    /约翰

    • 2
  5. Best Answer
    sleske
    2009-07-07T09:40:02+08:002009-07-07T09:40:02+08:00

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

    — 行动:-退出

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

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

    -quit 在 fileutils V4.2.3 中添加

    • 2
  6. pgs
    2009-07-03T05:08:36+08:002009-07-03T05:08:36+08:00

    tar 有一个--diff选项可以“查找存档和文件系统之间的差异”。如果您保留上传文件的本地副本,则可以将它们与该文件进行比较。

    • 1
  7. egorgry
    2009-07-03T05:47:16+08:002009-07-03T05:47:16+08:00

    您还有小写的 -g 选项 -g, --listed-incremental F 创建/列出/提取新的 GNU 格式增量备份

    我从来没有玩过它,但你可以编写一些东西,所以首先在非关键的情况下测试它。;) 进行完整备份

    tar -zcvf /home/backup.tar.gz /backup_dir
    

    然后

      NOW=$(date +"%d-%m-%Y")
      i=$(date +"%Hh%Mm%Ss")
      FILE="i.$NOW-$i.tar.gz"
    
    tar -g /home/backup.incremental.txt -zcvf /backup/$FILE /backup_dir
    
    • 1
  8. ThorstenS
    2009-07-03T08:08:03+08:002009-07-03T08:08:03+08:00

    我将备份完全切换到rsnapshot(perlscript,它使用 rsync 和硬链接,它可以备份远程主机)

    每天晚上 rsync 只复制较新的文件 - 由于硬链接 - 每个备份文件夹都代表完整的数据。

    rsnapshot 速度超快,恢复也很简单——试试吧!

    • 1
  9. Avery Payne
    2009-07-03T08:52:45+08:002009-07-03T08:52:45+08:00

    激进的想法:您可以让系统审核每次访问的相关文件。

    这在日志记录方面非常冗长,但会在每次读/写时为您提供日期戳。是的,它在概念上类似于 Windows NT 审计日志记录。对于您的设置来说,这可能有点矫枉过正,但为了完整起见,我放弃了这个概念......

    您可以在此处使用此简短教程设置审核。

    优点:

    • 捕获几乎所有内容,包括多次编辑和更改的历史记录。
    • 非常精细的颗粒控制
    • 可以选择性地按文件审计

    缺点:

    • 如果没有正确地夯实到您关心的目录,则日志溢出会增加 1 亿个百分点。明智地使用它。
    • 不审计数据变化,只审计谁做了什么,什么时候做了

    您可以使用该ausearch工具根据每个文件名定位对文件的更改。在每个文件的基础上迭代目录(和子目录?)的简单脚本将允许您对简单文件发出更改,为您提供在您指定的标准中“触及”的文件列表。您可以使用其他过滤选项轻松扩展此功能,ausearch适用于每个用户(如果您有服务的用户帐户,则很有用)、每个命令等。

    • 1
  10. Geoff Fritz
    2009-07-03T09:24:08+08:002009-07-03T09:24:08+08:00

    您可以安装 git 并解析相关目录的“git status”(或者可能是退出代码?)的输出。Git 的工作速度非常快。

    只需确保提交更改,因此对“git status”的连续调用将显示更改。

    另一个想法是使用tripwire 或一些类似的工具。

    更暴力的方法是定期对目录进行 tar,并比较前一个 tar 的 MD5。但是,如果目录很大,这将不会很好地扩展。

    • 1

相关问题

  • IIS 6.0 (Windows Server 2003) 备份的最佳实践?

  • 10TB数据和3台服务器的备份解决方案

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

  • 最佳混合环境(OS X + Windows)备份?[关闭]

  • 如何从 SQL Server 2008 中的备份中排除索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve