如何保存更改的文件?


8

我有两个文件夹:

  • 原版的/
  • ORIGINAL_AND_MY_CHANGES /

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

PS我尝试过,diff但是它无法保存二进制数据,并且rsync --link-dest-生成的硬链接在存档中没有用。

PPS就我而言,修改时间不能用于确定更改了哪个文件。


Answers:


7

使用rsync

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

Rsync具有增量备份功能。

cd ORIGINAL_AND_MY_CHANGED
rsync -a -c --compare-dest=../ORIGINAL . ../CHANGES_ONLY
  • -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
' {} +

它比enzotib更好,因为我可以将MY_CHANGES放在源代码管理中并更新/跟踪这些更改(如果我在源代码管理下更新rsync的批处理文件,将无法查看更改了哪些文件)
Dmitry

@Dmitry如果您使用的是源代码管理,为什么不放入import / track ORIGINALORIGINAL_AND_MY_CHANGES建立分支呢?然后CHANGES用scm命令找出。
吉尔(Gilles)'所以

以我ORIGINAL为例,它是Android平台资源(3GB,126000个文件)。即使运行rsync也需要15到20分钟。我认为,在源代码控制下添加所有这些内容将占用太多的空间和时间。
德米特里(Dmitry)

@Dmitry然后解决。如果是Android来源,请使用repo和git。在自己的分支机构上工作。用版本控制来管理这些代码已经很难了,我不禁思考,如果没有它,那会是什么样。幸运的是,git非常擅长管理本地分支机构。
吉尔(Gilles)“所以,别再邪恶了”,

不幸的是,这是一个自定义的Android资源,其中没有任何repo / git存储库。
德米特里

5

命令

rsync --only-write-batch=FILE $other_options ORIGINAL_AND_MY_CHANGES/ ORIGINAL/

会生成包含所需更改的批处理FILE(不进行任何修改)。

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

rsync --read-batch=FILE ORIGINAL/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.