1

У меня есть папка с подпапками и файлами. Я создаю файл .zip через PowerShell Compress-Archive .

Проблема в том, что файловая структура портится при открытии в Linux.

Bad - это архив bad.zip, созданный в Powershell с помощью Compress-Archive , а Good is good.zip, созданный с помощью Windows WinRAR.

Вот как это выглядит в Linux: (слева плохо, справа хорошо)

фото 1

Содержимое файла, видимое в Linux с помощью cat: (слева плохо, справа хорошо):

фото 2

Как решить эту проблему ??

...

Я попытался заменить все "\" в bad.zip на "/" в nano, и это сработало.

Я попытался автоматизировать это с помощью этого сценария, но безуспешно:

#!/bin/bash

contents=$(cat $1)
echo "${contents//\\//}"

Я запускаю скрипт:

./FixZip.sh bad.zip > new.zip

Обратные косые черты были заменены, как и предполагалось, но new.zip открыть нельзя. Причина, вероятно, в том, что кодировка другая ...

Это кодировка для 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ũ

1 ответ1

0

В том, что вы пытаетесь сделать, есть много неправильных вещей, наиболее значимо:

  1. Вы не можете редактировать zip-файл, не повредив его: это обычно определяется по его контрольной сумме, и о поврежденном файле будет сообщено.
  2. echo $contents (или другие варианты расширения) заменит любую последовательность символов пробела одним пробелом.
  3. Обратные косые черты будут возникать в сжатых данных, а также в индексе файла, поэтому замена их приведет к дальнейшему повреждению файла.

Наиболее удовлетворительным ответом является использование кроссплатформенного архиватора, такого как 7-Zip, который будет сохранять архив с общими разделителями каталогов и будет расширяться в собственном формате для платформы, где он вызывается.

В Windows я использую версию Portable Apps , которую можно запускать через интерфейс PortableApps Suite или напрямую из ее каталога; портативная версия содержит 32- и 64-разрядные сборки и включает в себя 7z.exe , интерфейс командной строки (который может использовать DLL из той же директории).

Не понятно, почему в ваших логах нужно было заменить магическое число PK , но я бы предположил, что ответные символы, символы пробела или escape-символы могут объяснить это. Как Камиль Макиоровски рекомендует в своем комментарии, xxd прояснит, что происходит.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .