如何保存更改的文件?

Dmi*_*try 8 diff rsync file-copy

我有两个文件夹:

  • 原来的/
  • ORIGINAL_AND_MY_CHANGES/

我的朋友有一份 ORIGINAL/。我想生成 MY_CHANGES.tgz - 与 ORIGINAL/ 相比,它应该只包含来自 ORIGINAL_AND_MY_CHANGES/ 的新文件/更改文件。所以我的朋友可以将它解压到他的 ORIGINAL/ 副本中并获得 ORIGINAL_AND_MY_CHANGES/。我怎样才能做到这一点?

PS 我试过了,diff但它不能保存二进制数据,而且rsync --link-dest——它会生成在存档中无用的硬链接。

PPS 在我的情况下,不能使用修改时间来决定更改了哪个文件。

Gil*_*il' 7

使用 rsync

您所做的本质上是增量备份:您的朋友(您的备份)已经拥有原始文件,并且您想要制作一个包含您从原始文件更改的文件的存档。

Rsync具有增量备份功能。

cd ORIGINAL_AND_MY_CHANGED
rsync -a -c --compare-dest=../ORIGINAL . ../CHANGES_ONLY
Run Code Online (Sandbox Code Playgroud)
  • -a 意味着保留所有属性(时间、所有权等)。
  • -c 意味着比较文件内容而不是依赖日期和大小。
  • --compare-dest=/some/directory意味着不复制该目录和源树下相同的文件。请注意,路径是相对于目标目录的。

Rsync 复制所有目录,即使那里没有文件。要删除这些空目录,请运行find -depth CHANGES_ONLY -type d -empty -delete(或者,如果您find没有-deleteand -empty,请运行find -depth CHANGES_ONLY -exec rmdir {} + 2>/dev/null)。

然后从CHANGES_ONLY目录制作存档。

行人方式

使用您的文件遍历目录。跳过与原始文件相同的文件。根据需要在目标中创建目录。复制更改的文件。

cd ORIGINAL_AND_MY_CHANGES
find . \! -type d -exec sh -c '
  for x; do
    if cmp -s "$x" "../ORIGINAL/$x"; then continue; fi
    [ -d "../CHANGES_ONLY/$x" ] || mkdir -p "../CHANGES_ONLY/${%/*}"
    cp -p "$x" "../CHANGES_ONLY/$x"
  done
' {} +
Run Code Online (Sandbox Code Playgroud)


enz*_*tib 5

命令

rsync --only-write-batch=FILE $other_options ORIGINAL_AND_MY_CHANGES/ ORIGINAL/
Run Code Online (Sandbox Code Playgroud)

将生成一个包含所需更改的批处理文件(不修改任何内容)。

该补丁可以应用在另一个站点上,您可以在其中获取批处理文件,

rsync --read-batch=FILE ORIGINAL/
Run Code Online (Sandbox Code Playgroud)