Сравните две версии zip-файла и найдите, какой файл был изменен в этом zip-файле. - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть два архива с именами 10.88.10 и 10.88.12. Один или несколько файлов в 10.88.12 были изменены. В любом случае я могу узнать, какой файл был изменен. Zip-файл содержит каталог, подкаталог и zip-файлы внутри

Код, который я пробовал (не думайте, что я на правильном пути)

m1= md5sum 10.88.10.zip | cut -d' ' -f1
m2=  md5sum 10.88.12.zip | cut -d' ' -f1

 if [ "m1" != "m2" ]; then
                echo file are not same


cd "/c/Users/name/Downloads/10.88.10/"

while [ "`find . -type f -name '*.zip' | wc -l`" -gt 0 ]
do

        cd "/c/Users/name/Downloads/10.88.10/"
        find . -type f -name "*.zip" -exec unzip -- '{}' \; -exec rm -- '{}' \;
done

cd "/c/Users/name/Downloads/10.88.12/"


        while [ "`find . -type f -name '*.zip' | wc -l`" -gt 0 ]
        do
                find . -type f -name "*.zip" -exec unzip -- '{}' \; -exec rm -- '{}' \;
        done

cd "/c/Users/name/Downloads/"
        find 10.88.10/* -type f -print0 | xargs -0 sha1sum |cut -d' ' -f1 > file1.txt
        find 10.88.12/* -type f -print0 | xargs -0 sha1sum | cut -d' ' -f1 > file2.txt
       diff file1.txt file2.txt


else
        echo false
fi

** Попытка ha sh найти измененный файл путем сравнения и получения уникального, но, к сожалению, получить только ha sh и не может придумать способ получить имена этих файлов ha sh ** **

запуск ha sh cmd: find 10.88.10/* -type f -print0 | xargs -0 sha1sum

вывод

c3f2b563b3cb091e2adsss321221a3d *10.88.12/name.xml

Deference / Модифицированный файл в ha sh

1c1
< 3c2a991d1231c3eae391fadsdadda19e8f7b85df8caf2d
---
> c3f2b56qwdq2112e375b40fbfd5e60f526da3d1874c1874
< fbdc82dasdaa30538e5adadadada2d9456ff86953fbeeb1
---
> f962e8eqeqeqqe3b65d3ed43559adc879f5600c738e1e1c

ТРЕБУЕМЫЙ ВЫХОД

 < 10.88.10/FOLDER/FILE1.XML 
---
> 10.88.12/FOLDER1/FILE1.XML
< 10.88.10/FOLDER/FILE2.TXT
---
> 10.88.12/FOLDER/FILE2.TXT

ЕСЛИ у кого-нибудь есть java решение или bash скрипт, поделитесь им. будет оценена

1 Ответ

2 голосов
/ 27 февраля 2020

Ниже приведен сценарий оболочки, который использует возможность инструмента командной строки sqlite3 для открытия zip-файлов , чтобы избежать необходимости разархивировать файлы во временную папку и использовать простой SQL для выполнения всей работы. :

#!/bin/sh

oldfile="$1"
newfile="$2"

sqlite3 -batch -bail <<EOF
.mode tabs
.headers off
CREATE VIRTUAL TABLE oldfile USING zipfile('${oldfile}');
CREATE VIRTUAL TABLE newfile USING zipfile('${newfile}');
-- Show files present in newfile that are absent in oldfile
SELECT 'added', name
FROM (SELECT name FROM newfile EXCEPT SELECT name FROM oldfile)
ORDER BY name;
-- Show files missing from newfile that are present in oldfile
SELECT 'deleted', name
FROM (SELECT name FROM oldfile EXCEPT SELECT name FROM newfile)
ORDER BY name;
-- Show files whose contents differ between the two
SELECT 'modified', of.name
FROM oldfile AS of
JOIN newfile AS nf ON of.name = nf.name
WHERE of.data <> nf.data
ORDER BY of.name;
EOF

Пример использования:

$ unzip -l test1.zip
Archive:  test1.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2020-02-27 04:05   1/
        4  2020-02-27 04:05   1/a.txt
        4  2020-02-27 04:05   1/b.txt
        4  2020-02-27 04:05   a.txt
---------                     -------
       12                     4 files
$ unzip -l test2.zip
Archive:  test2.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2020-02-27 04:07   1/
        4  2020-02-27 04:07   1/a.txt
        4  2020-02-27 04:06   a.txt
        4  2020-02-27 04:06   b.txt
---------                     -------
       12                     4 files
$ ./cmpzip test1.zip test2.zip
added   b.txt
deleted 1/b.txt
modified        1/a.txt

(Я не уверен, почему вы хотите вывод в стиле diff, когда все, что вам кажется важным, это , если файл изменился, а не что означает , поэтому получается вывод TSV, который легче понять и с которым можно работать при дальнейшей обработке)

...