Linux zip中的diff文件,而不进行解压缩

Linux zip中的diff文件,而不进行解压缩,linux,zip,diff,unzip,Linux,Zip,Diff,Unzip,有没有办法在两个拉链中对两个文件执行差异操作而不提取它们?如果没有-是否有其他方法可以在不提取的情况下进行比较 谢谢。解压-l将列出zip文件的内容。然后,您可以按照此处提到的正常方式将其传递到diff: 例如,如果您有两个zip文件: foo.zip bar.zip 如果您想diff两个文件(如图所示),您可以运行diff-y,您必须将它们提取出来,即使只提取到内存 为了在两个ZIP中查看两个文件的差异,您可以执行以下操作(无错误检查或其他操作): 注:-v表示详细和-l列表内容) 在上面的

有没有办法在两个拉链中对两个文件执行差异操作而不提取它们?如果没有-是否有其他方法可以在不提取的情况下进行比较


谢谢。

解压-l将列出zip文件的内容。然后,您可以按照此处提到的正常方式将其传递到
diff

例如,如果您有两个zip文件:

foo.zip
bar.zip

如果您想
diff
两个文件(如图所示),您可以运行
diff-y,您必须将它们提取出来,即使只提取到内存

为了在两个ZIP中查看两个文件的差异,您可以执行以下操作(无错误检查或其他操作):

注:
-v
表示详细和
-l
列表内容)

在上面的示例中,您可以看到校验和(CRC-32)是不同的

您可能还对该项目感兴趣:

如果只需要检查文件是否相等,可以比较存储在存档本地头字段/中心目录中的CRC32校验和。

结合到目前为止的响应,下面的bash函数将比较zip文件中的文件列表。清单包括详细的输出(
unzip-v
),因此可以比较校验和。输出按文件名(
sort-k8
)排序,以允许并排比较,并扩展差异输出(
W200
),因此文件名在并排视图中可见

function zipdiff() { diff -W200 -y <(unzip -vql $1 | sort -k8) <(unzip -vql $2 | sort -k8); }

function zipdiff(){diff-W200-y我希望ZIP中的文件之间以可读的格式存在实际差异。下面是我为此目的编写的一个bash函数,它利用了git。如果您已经将git作为正常工作流程的一部分使用,并且可以读取git差异,那么这是一个很好的UX

#用法:zipdiff before.zip after.zip
函数zipdiff{
当前=$(pwd)
before=“$current/$1”
“$current/$2”之后
tempdir=$(mktemp-d)
cd“$tempdir”
git init&>/dev/null
解压-qq“$before”*
git add.&>/dev/null
git commit-m“在”&>/dev/null之前
rm-rf“$tempdir/*”
是|解压-qq“*&>/dev/null
git添加。
git diff——缓存
cd“$当前”
rm-rf“$tempdir”
}
仅压缩文件内容 < >我正在寻找一种方法来比较存储在zip文件中的文件的内容,而不是其他元数据。考虑以下内容:

$ echo foo > foo.txt
$ zip now.zip foo.txt
  adding: foo.txt (stored 0%)
$ zip later.zip foo.txt
  adding: foo.txt (stored 0%)
$ diff now.zip later.zip 
Binary files now.zip and later.zip differ
从概念上讲,这毫无意义;我对相同的输入运行了相同的命令,得到了两个不同的输出!区别在于元数据,它存储了文件添加的日期

$ unzip -v now.zip 
Archive:  now.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
       4  Stored        4   0% 04-08-2020 23:27 7e3265a8  foo.txt
--------          -------  ---                            -------
       4                4   0%                            1 file
$ unzip -v later.zip
Archive:  later.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
       4  Stored        4   0% 04-08-2020 23:28 7e3265a8  foo.txt
--------          -------  ---                            -------
       4                4   0%                            1 file
注意:为了清晰起见,我在这里手动编辑了第二个文件的时间,从
23:27
23:28
。文件中的字段本身存储秒的值(在我的情况下,它不同——二进制差异仍然会失败),即使它们没有在命令的输出中表示

因此,为了仅区分文件,我们必须忽略日期字段。
unzip-vqq
将为我们提供更好的摘要:

$ unzip -vqq now.zip
       4  Stored        4   0% 04-08-2020 23:27 7e3265a8  foo.txt
因此,让我们屏蔽字段(我们不关心日期或压缩度量)并对文件进行排序:

$ unzip -vqq now.zip  | awk '{$2=""; $3=""; $4=""; $5=""; $6=""; print}' | sort -k3
4      7e3265a8 foo.txt
太长,读不下去了 区分2个zipfiles(
a.zip
b.zip
)的命令是

diff\

开源库zip Ada中的comp_-zip工具(可用或不可用)在不提取的情况下执行比较:内容、b.zip中缺少的a.zip文件以及两者的完整性检查。

通过对
zipcmp
的输出进行后处理,您可以递归浏览归档文件,以获得它们之间差异的更详细摘要

#!/bin/bash

# process zipcmp's output to do true diffs of archive contents
# 1. grep removes the '+++' and '---' from zipcmp's output
# 2. awk prints the final column of output
# 3. sort | uniq to dedupe
for badfile in $(zipcmp ${1?No first zip} ${2?No second zip} \
    | grep -Ev '^[+-]{3}' \
    | awk '{print $NF}' \
    | sort | uniq);
do
    echo "diffing $badfile"
    diff <(unzip -p $1 $badfile) <(unzip -p $2 $badfile) ;
done;

!/bin/bash
#处理zipcmp的输出,以对归档内容进行真正的区分
#1.grep从zipcmp的输出中删除“+++”和“---”
#2.awk打印输出的最后一列
#3.排序| uniq以消除重复数据
对于$(zipcmp${1?无第一个zip}${2?无第二个zip}中的坏文件\
|grep-Ev'^[+-]{3}'\
|awk'{print$NF}'\
|排序| uniq);
做
echo“diffing$badfile”
diffWeb工具(例如)提供了一个非常好的可视化信息,其中zip中的哪些文件已更改:

这对于不太大的zip文件非常方便,无需安装任何东西。这不仅适用于Linux,也适用于包括Windows和Mac在内的其他操作系统


其他答案中讨论的工具显然提供了更高级的选项,对于较大的zip文件可以更快。

一些命令行工具存在:

  • 用Perl编写
  • 用Java编写
  • 上一个的.NET端口
  • 用C编写,来自libzip库
  • 从gzip,可以在zip文件上使用

  • 我很喜欢使用diffzips.pl来比较epub文件的内容。diffzips.pl还具有递归的优势,可以比较父zip中的zip文件。

    您只想知道这两个文件是否不同,还是希望获得视觉差异?如果您想知道它们是否不同,请使用
    sha512 filename1
    sha512 filename2
    并查看输出是否相同。添加
    --suppress common lines
    标志以仅显示不同的行对我来说效果非常好:
    diff-y我使用了
    函数zipdiff(){diff-y这不会检测到对现有文件的更改,而该文件恰好保持相同的大小。-vql而不是-l打印校验和,但它们是CRC32(这意味着它们不会像加密哈希函数那样可靠地检测故意篡改)。非常有帮助,谢谢。我发现添加了
    ——抑制公共线
    ,效果更好,正如下面另一条评论所建议的。
    $ unzip -vqq now.zip
           4  Stored        4   0% 04-08-2020 23:27 7e3265a8  foo.txt
    
    $ unzip -vqq now.zip  | awk '{$2=""; $3=""; $4=""; $5=""; $6=""; print}' | sort -k3
    4      7e3265a8 foo.txt
    
    diff \
      <(unzip -vqq a.zip  | awk '{$2=""; $3=""; $4=""; $5=""; $6=""; print}' | sort -k3) \
      <(unzip -vqq b.zip  | awk '{$2=""; $3=""; $4=""; $5=""; $6=""; print}' | sort -k3)
    
    #!/bin/bash
    
    # process zipcmp's output to do true diffs of archive contents
    # 1. grep removes the '+++' and '---' from zipcmp's output
    # 2. awk prints the final column of output
    # 3. sort | uniq to dedupe
    for badfile in $(zipcmp ${1?No first zip} ${2?No second zip} \
        | grep -Ev '^[+-]{3}' \
        | awk '{print $NF}' \
        | sort | uniq);
    do
        echo "diffing $badfile"
        diff <(unzip -p $1 $badfile) <(unzip -p $2 $badfile) ;
    done;