Mam folder z podfolderami i plikami. Plik .zip tworzę za pomocą programu PowerShell Compress-Archive
.
Problem polega na tym, że struktura plików jest popsuta po otwarciu w systemie Linux.
Bad to archiwum bad.zip wykonane w programie Powershell Compress-Archive
, a Good is good.zip wykonane w systemie Windows WinRAR.
Tak to wygląda w systemie Linux: (lewy jest zły, prawy jest dobry)
Zawartość pliku widoczna w systemie Linux z cat
: (lewy jest zły, prawy jest dobry):
Jak rozwiązać ten problem?
...
Próbowałem zamienić wszystkie „\” w bad.zip na „/” w nano i zadziałało .
Próbowałem zautomatyzować to za pomocą tego skryptu, ale bezskutecznie:
#!/bin/bash
contents=$(cat $1)
echo "${contents//\\//}"
Uruchamiam skrypt:
./FixZip.sh bad.zip > new.zip
Odwrotne ukośniki zostały zastąpione zgodnie z przeznaczeniem, ale nie można otworzyć new.zip. Powodem jest prawdopodobnie kodowanie jest inne ...
To jest kodowanie plików zip:
terminal:# file -i bad.zip
bad.zip: application/zip; charset=binary
terminal:# encguess bad.zip
bad.zip UTF-32LE
terminal:# file -i new.zip
new.zip: application/octet-stream; charset=binary
terminal:# encguess new.zip
new.zip unknown
terminal:# cat new.zip
P5�WMCw:a_folder/test2.txt+��IP7�WM���a_folder/test3.txt�(*P4�WM��6a_folder/subf/test1.txt�H���P5�WMCw:a_folder/test2.txtP7�WM���7a_folder/test3.txt4�WM��6ma_folder/subf/test1.txtPKũ
$(cat $1)
zastąpi dowolną sekwencję znaków spacji pojedynczym spacją; (3) ukośniki pojawią się w skompresowanych danych, a także w indeksie plików, więc ich zastąpienie spowoduje dalsze uszkodzenie pliku. Nie jest oczywiste, dlaczegoPK
magiczna liczba powinna zostać zastąpiona, ale przypuszczam, że to wyjaśnia znaki powrotu, spacji lub ucieczki w pliku binarnym. Jak zaleca @KamilMaciorowski,xxd
wyjaśni, co się dzieje.PortableApps\
katalogu, który zawiera 32- i 64-bitowe wersje zarówno GUI, jak i wersji7z.exe
wiersza poleceń, które, jak sądzę, będą potrzebowały jednego lub więcej.dll
plików.Odpowiedzi:
Z tym, co próbujesz zrobić, jest wiele rzeczy nie tak - najważniejsze:
echo $contents
(lub inne warianty rozszerzenia) zastąpi dowolną sekwencję znaków białych znaków pojedynczą spacją.Najbardziej zadowalającą odpowiedzią jest użycie wieloplatformowego archiwizatora, takiego jak 7-Zip , który zapisze archiwum z ogólnymi separatorami katalogów i rozwinie się w natywnym formacie dla platformy, na której się nazywa.
W systemie Windows korzystam z wersji Portable Apps , którą można uruchamiać przez interfejs PortableApps Suite lub bezpośrednio z katalogu w izolacji; wersja przenośna zawiera wersje 32- i 64-bitowe i zawiera
7z.exe
interfejs wiersza polecenia (który może wykorzystywać bibliotekę DLL z tego samego katalogu).Nie jest oczywiste, dlaczego w twoich logach
PK
magiczna liczba powinna zostać zastąpiona, ale domyślam się, że znaki powrotu, spacji lub znaki specjalne w pliku binarnym mogą to wyjaśniać. Jak Kamil Maciorowski zaleca w swoim komentarzu,xxd
wyjaśni, co się dzieje.źródło