2016-02-23 35 views
6

Esiste un modo per eseguire l'operazione di contrasto su due file in due cerniere senza estrarli? In caso contrario - qualsiasi altra soluzione alternativa per confrontarli senza estrarre?file diff all'interno di zip senza estrarlo

Grazie.

+0

Vuoi solo sapere se i due file differiscono o vuoi ottenere una differenza visiva? – gollum

risposta

6

unzip -l elencherà il contenuto di un file zip. È quindi possibile passare che a diff in modo normale, come indicato qui: https://askubuntu.com/questions/229447/how-do-i-diff-the-output-of-two-commands

Così, per esempio se si ha due file zip:

foo.zip 
bar.zip 

si potrebbe correre diff -y <(unzip -l foo.zip) <(unzip -l bar.zip) di fare un side-by-side diff del contenuto dei due file.

Spero che questo aiuti!

+2

Aggiungendo il flag '--suppress-common-line' per visualizzare solo le righe che differivano per me: ' diff -y <(unzip -l foo.zip) <(unzip -l bar.zip) --suppress-common-lines' – KostasX

+2

Ho finito con 'function zipdiff() {diff -y <(unzip -l $ 1) <(unzip -l $ 2) --suppress-common-lines; } ', e questo ha funzionato perfettamente per quello che stavo cercando di fare. –

4

Se vuoi i file diff due (come in vedere la differenza) devi estrarli - anche se solo per memoria!

Per vedere il diff di due file in due cerniere si può fare qualcosa di simile (nessun controllo di errore o di sorta):

# 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 

Nota: i file unzip -p estratti a p ipe (stdout) .

Se solo si vuole sapere se i file sono diversi è possibile ispezionare i loro checksum utilizzando

unzip -v -l zipfile [file_to_inspect] 

Nota: -v verbose e -l lista contenuti)

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 

Nell'esempio sopra di voi può vedere che i checksum (CRC-32) sono diversi.

Potreste anche essere interessati a questo progetto: https://github.com/nhnb/zipdiff

0

Se è necessario solo per verificare se i file sono uguali è possibile confrontare CRC32 checksum, che sono memorizzati in archivio campi di intestazione locali/directory centrale.

5

Combinando le risposte finora, la seguente funzione di bash confronterà gli elenchi di file dai file zip. Gli elenchi includono l'output dettagliato (unzip -v), quindi i checksum possono essere confrontati. L'output è ordinato per nome file (sort -k8) per consentire il confronto affiancato e l'output diff espanso (W200) in modo che i nomi dei file siano visibili nella vista affiancata.

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

Questo può essere aggiunto al file ~/.bashrc per essere utilizzato da qualsiasi console. Può essere utilizzato con zipdiff a.zip b.zip. Piping dell'output su less o reindirizzamento a un file è utile per file zip di grandi dimensioni.