如何仅运行文件夹中任何被修改的文件的 shell 脚本?

如何仅运行文件夹中任何被修改的文件的 shell 脚本?

我需要通过非常慢的链接将文件夹复制到多个目的地。

目前我使用 find 创建了一个文本文件。

find "$sourcedir" -exec ls -la {} \; > "$statefile"

然后,我将其与之前以相同方式创建的文件进行比较,以确定脚本是否应退出或执行一些 rsync。最后,新的状态文件将成为下次脚本运行时的旧状态文件。

if ! diff "$statefile" "$statefile".old 

有没有更好的方法最大限度地减少源上的资源使用?(与 Debian 上的 bash 兼容。)

我是否应该只运行第一个 rsynd,然后在更改后再执行其余操作?如何判断 rsync 在第一个 rsync 之后是否实际修改了任何文件?

答案1

您想减少 find、ls 和 diff 使用的资源吗?我猜想这必定与大量文件有关...

-exec ... +显然,通过使用而不是 ,您可以节省大量 ls 调用-exec ... ;。而且您可以考虑完全摆脱 ls,因为它可以完成 find 本身无法完成的任何任务。您可以使用 find 的 printf 值生成文件,从而创建或多或少相同的输出。但是:ls 和 find 都无法检测某些 ACL 和扩展属性更改。

一种完全不同的方法:FAM(文件更改监视器)。让内核告诉您(例如fileschanged)什么(可能)发生了变化。

还有一个提示:像 rdiff-backup 这样的程序应该比 rsync 需要更少的带宽,因为

  1. 检查在当地进行
  2. 检查仅进行一次,而不是针对每个目标都进行检查

相关内容