类似 rsync 的存档文件更新

类似 rsync 的存档文件更新

使用 更新备份时rsync --include-from=files --exclude-deleted,您可以获得类似以下的反馈:

Added file: new.file
Added file: other.file
Deleted file: deleted.file
etc.

是否可以使用标准 UNIX 归档工具(zip、tar 等)实现相同的目的,例如。新文件会添加到存档中,删除的文件会被删除吗?

例如,zip -ru@ out < files根据包含列表更新存档,但已删除的文件不是已删除。所以你的档案中留下了很多剩余的垃圾。

当然,您可以删除存档并重新创建整个内容,但是您会得到数千行输出,表明所有文件都已添加,因此您不会得到“增量”输出,可以这么说。

(附带问题是如何在包含文件中包含基于通配符的文件,但这可能适合单独的问题。)

答案1

您可以使用 zip 中的选项--filesync

来自邮编(1)手册页:

-FS

--文件同步 将存档的内容与操作系统上的文件同步。通常,更新存档时会添加新文件并更新更改的文件,但不会从存档中删除操作系统上不再存在的文件。此选项启用一种新模式,根据文件系统检查存档中的条目。如果条目的文件时间和文件大小与操作系统文件的文件时间和文件大小匹配,则从旧存档中复制该条目,而不是从文件系统中读取并压缩该条目。如果操作系统文件已更改,则会照常读取和压缩该条目。如果存档中的条目与操作系统上的文件不匹配,则该条目将被删除。启用此选项应该创建与新存档相同的存档,但由于现有条目是复制而不是压缩,因此可以使用以下命令更新现有存档-FS比创建新档案要快得多。还可以考虑使用-u用于更新档案。要使此选项起作用,应从创建存档的同一目录中更新存档,以便相对路径匹配。如果从旧存档复制的文件很少,则创建新存档可能会更快。请注意,时区环境变量 TZ 应根据本地时区进行设置,以便此选项正常工作。自创建原始存档以来时区的更改可能会导致所有文件无法进行时间匹配和重新压缩。

此选项从存档中删除文件。如果需要保留原始存档,请先制作存档的副本或使用- 出去将更新的存档输出到新文件的选项。尽管可能会更慢,但使用新存档名称创建新存档更安全,可以避免存档和操作系统路径之间的不匹配,并且是首选。

例子:

user@host:~/$ mkdir compressme; echo "Lorem Ipsum" >compressme/file1; echo "Lorem Ipsum" >compressme/file2; echo "Lorem Ipsum" >compressme/file3
user@host:~/$ zip -r --filesync all.zip compressme
  adding: compressme/ (stored 0%)
  adding: compressme/file2 (stored 0%)
  adding: compressme/file1 (stored 0%)
  adding: compressme/file3 (stored 0%)
user@host:~/$ rm compressme/file2
user@host:~/$ zip -r --filesync all.zip compressme
updating: compressme/ (stored 0%)
deleting: compressme/file2

答案2

对于(GNU)tar(1),有-u(更新)。但它才不是就地更新,只是在最后追加了新的内容(结果包含了文件的几个版本,以后整理起来真有趣……),-a(追加)和-delete(手册上没有说是否真的删除了,或者只是标记为不存在,我怀疑是后者)。

ar(1) 格式(最常用于静态库;但是真正的存档格式)允许d删除、move 和quick 追加。

这里 cpio(1) 有一个很大的警告,它应该不是可以使用,因为它不可携带。

Unix 标准 pax(1) 没有修改档案的规定(难怪,这里 spax(1) 处理少量格式)。

如果存档被压缩,那么你就不走运了。您使用上述工具所做的就是归档并压缩结果。对存档内容的任何修改都需要重新压缩整个存档。

请注意,zip(1) 格式是一堆单独压缩的文件,添加/删除/移动其中的内容(相对)容易。

相关内容