解凍せずに2つのzip内の2つのファイルに対して異なる操作を実行する方法はありますか?そうでない場合-抽出せずにそれらを比較する他の回避策?
ありがとう。
_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つのファイルの内容を並べて比較できます。
お役に立てば幸いです。
これまでの応答を組み合わせると、次の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ファイルで役立ちます。
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 -p
pipe(stdout)にファイルを抽出します。
ファイルが異なるかどうかだけを知りたい場合は、次のコマンドを使用してチェックサムを検査できます
unzip -v -l zipfile [file_to_inspect]
注意: -v
は冗長を意味し、-l
listの内容)
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
私は、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
}
他のメタデータではなく、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
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)
ファイルが等しいかどうかを確認するだけの場合は、アーカイブローカルヘッダーフィールド/中央ディレクトリに保存されているCRC32チェックサムを比較できます。