web-dev-qa-db-ja.com

解凍せずにZip内のファイルを比較する

解凍せずに2つのzip内の2つのファイルに対して異なる操作を実行する方法はありますか?そうでない場合-抽出せずにそれらを比較する他の回避策?

ありがとう。

12
Gum Bi

_unzip -l_は、Zipファイルの内容をリストします。次に、ここで説明されているように、通常の方法でdiffにそれを渡すことができます。 https://askubuntu.com/questions/229447/how-do-i-diff-the-output-of- 2つのコマンド

たとえば、2つのZipファイルがある場合は、次のようになります。

_foo.Zip
bar.Zip
_

diff -y <(unzip -l foo.Zip) <(unzip -l bar.Zip)を実行して、2つのファイルの内容を並べて比較できます。

お役に立てば幸いです。

8
sysadmiral

これまでの応答を組み合わせると、次のbash関数はZipファイルのファイルリストを比較します。リストには詳細出力(unzip -v)が含まれているため、チェックサムを比較できます。出力はファイル名(sort -k8)で並べ替えられ、並べて比較したり、差分出力(W200)を展開したりできるので、ファイル名を並べて表示できます。

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

これを~/.bashrcファイルに追加して、任意のコンソールから使用できます。 zipdiff a.Zip b.Zipと一緒に使用できます。出力をlessにパイピングするか、ファイルにリダイレクトすると、大きなZipファイルで役立ちます。

8
Mark Howard

2つのファイルをdiffしたい場合(のように違いを見るを参照)、それらを抽出する必要があります。

2つのzip内の2つのファイルの差分を確認するには、次のようにします(エラーチェックなどは行いません)。

# define a little bash function
function zipdiff () { diff -u <(unzip -p $1 $2) <(unzip -p $3 $4); }

# test it: create a.Zip and b.Zip, each with a different file.txt
echo hello >file.txt; Zip a.Zip file.txt
echo world >file.txt; Zip b.Zip file.txt

zipdiff a.Zip file.txt b.Zip file.txt
--- /dev/fd/63  2016-02-23 18:18:09.000000000 +0100
+++ /dev/fd/62  2016-02-23 18:18:09.000000000 +0100
@@ -1 +1 @@
-hello
+world

注意: unzip -ppipe(stdout)にファイルを抽出します。

ファイルが異なるかどうかだけを知りたい場合は、次のコマンドを使用してチェックサムを検査できます

unzip -v -l zipfile [file_to_inspect]

注意: -vは冗長を意味し、-llistの内容)

unzip -v -l a.Zip 
Archive:  a.Zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
       6  Stored        6   0% 2016-02-23 18:23 363a3020  file.txt
--------          -------  ---                            -------
       6                6   0%                            1 file

unzip -v -l b.Zip 
Archive:  b.Zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
       6  Stored        6   0% 2016-02-23 18:23 dd3861a8  file.txt
--------          -------  ---                            -------
       6                6   0%                            1 file 

上記の例では、チェックサム(CRC-32)が異なることがわかります。

このプロジェクトにも興味があるかもしれません: https://github.com/nhnb/zipdiff

4
gollum

私は、zip内のファイル間の実際の差分を読みやすい形式でほしかった。これは、この目的のためにgitを使用して作成したbash関数です。これは、通常のワークフローの一部としてすでにgitを使用していて、git diffを読み取ることができる場合、優れたUXを備えています。

# usage: zipdiff before.Zip after.Zip
function zipdiff {
  current=$(pwd)
  before="$current/$1"
  after="$current/$2"
  tempdir=$(mktemp -d)
  cd $tempdir
  git init &> /dev/null
  unzip -qq $before *
  git add . &> /dev/null
  git commit -m "before" &> /dev/null
  rm -rf $tempdir/*  
  yes | unzip -qq $after * &> /dev/null
  git add .
  git diff --cached
  cd $current
  rm -rf $tempdir
}
1
voutasaurus

圧縮ファイルのコンテンツのみ

他のメタデータではなく、zipfileに保存されているファイルのcontentsを比較する方法を探していました。以下を検討してください。

$ 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

概念的には、これは意味がありません。同じ入力で同じコマンドを実行し、2つの異なる出力を取得しました!違いは、ファイルが追加された日付を格納するメタデータです。

$ 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

注:わかりやすくするために、ここでは2番目のファイルの時刻を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

TL; DR

2つのzipファイル(a.Zipおよびb.Zip)を比較するコマンドは次のとおりです。

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)
0
Ian

ファイルが等しいかどうかを確認するだけの場合は、アーカイブローカルヘッダーフィールド/中央ディレクトリに保存されているCRC32チェックサムを比較できます。

0