我想要做的是创建一个 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/
使用长名称格式 ( )提供完整路径 ( ) %f
,rsync
将返回额外的一行 ( /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 个随机文件old
,new
现在文件夹中有 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