从 2 个目录中更改的文件创建 zip 文件

从 2 个目录中更改的文件创建 zip 文件

我想要做的是创建一个 zip 文件(或一些不同的存档),其中包含来自 2 个提供的目录的所有已更改文件。文件的路径应保留在存档中,以便存档可以用作补丁。

所以基本上类似于:

diff -crN old_dir new_dir > pathfile

但是,为了方便起见,创建一个包含所有更改的文件的 zip 文件。

是否有标准解决方案,或者我需要为此创建自己的脚本?

答案1

您可以使用以下方式列出已修改的文件rsync

rsync -rnc --log-format='%f' new_dir/ old_dir/
  • -r代表递归
  • -n代表进行试运行(--dry-run 的同义词)
  • -c告诉 rsync 根据校验和比较文件
  • --log-format='%f'为我们提供文件名(长格式)

这将为您提供 new_dir/ 中已修改文件的列表

然后,您只需将此列表提供给zip

zip patch.zip `rsync -rnc --log-format='%f' new/ old/`

笔记如果您/path/to/new/dir/使用长名称格式 ( )提供完整路径 ( ) %frsync将返回额外的一行 ( /path/to/new/dir/.)。如果您使用短名称格式 ( %n),rsync将不会返回此行。

答案2

我并不是想说教,但 *nix 环境的美妙之处在于工具的多样性。不幸的是,我不知道有哪个软件包可以满足您的要求,但可以用脚本来实现。希望这个示例能帮助您编写这样的脚本。


我们有几个文件夹,里面有多个文件(0-5 x 0-5 的排列)。

$ ls new/ |sort | column -x -c 50 | sed 's/\t/ /g'
00 01 02 03 04 05
10 11 12 13 14 15
20 21 22 23 24 25
30 31 32 33 34 35
40 41 42 43 44 45
50 51 52 53 54 55

我从中删除了 7 个随机文件oldnew现在文件夹中有 7 个“新”文件:

$ find . -type d -exec sh -c 'echo -n {} " "; ls {} |wc -l' \;
.  2
./new  36
./old  29

Rsync(是一款用于复制文件并创建两个相同文件夹的强大工具)可以隔离这些新文件:

$ rsync --size-only --out-format=%f -rin new/ old/
new/05
new/15
new/21
new/22
new/35
new/54
new/55

这些文件名可以在我们将其复制到新位置

$ mkdir diff/new
$ rsync -r --size-only --compare-dest=../../old/ new/  diff/new/
$ tar -C diff -czf diff.tar.gz .

档案的内容是我们的新文件:

$ tar tf diff.tar.gz
./
./new/
./new/55
./new/54
./new/35
./new/05
./new/22
./new/15
./new/21

相关内容