Zip-файл, созданный в Powershell, нельзя использовать в Linux

405
MyWays

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

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

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

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

picture 1

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

picture 2

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

...

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

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

#!/bin/bash  contents=$(cat $1) echo "$" 

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

./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
`echo` и переменная оболочки - это громоздкий способ преобразования. В этом случае даже `tr` будет неправильным, потому что вам нужно исправить таблицу содержимого или около того, но не двоичные данные, где также может происходить обратная косая черта. `cat` - обращение к консоли для проверки двоичного файла также странно (подсказка:` xxd`). Возвращаясь к вопросу, для одного файла это может помочь: [Преобразовать созданный Windows ZIP в Linux (проблема с внутренними путями)] (https://unix.stackexchange.com/q/166159/108618). Я понимаю, что лучшим решением будет создание файлов, которые не нужно исправлять. Kamil Maciorowski 5 лет назад 0
Вы единственный человек на этом форуме? ... В любом случае .. Я не могу использовать 7zip для Windows, только для PowerShell Compress-Archive. Я думаю, я всегда могу воссоздать структуру файла с помощью скрипта .... MyWays 5 лет назад 1
Без обид. Просто он всегда мне помогает .. MyWays 5 лет назад 1
Несколько неправильных вещей: (1) вы не можете редактировать zip-файл, не повредив его, что обычно определяется его контрольной суммой; (2) `$ (cat $ 1)` заменит любую последовательность символов пробела одним пробелом; (3) обратная косая черта будет иметь место в сжатых данных, а также в индексе файла, поэтому замена их приведет к дальнейшему повреждению файла. Непонятно, почему магическое число `PK` должно было быть заменено, но я бы предположил, что возвращаемые символы, символы пробела или экранирующие символы в двоичном коде объясняют это. Как рекомендует @KamilMaciorowski, `xxd` прояснит, что происходит. AFH 5 лет назад 1
«Я не могу использовать 7zip для Windows, только для PowerShell Compress-Archive». - действительно? Вы уже сказали, что можете использовать WinRAR. 7-Zip доступен в виде [Portable App] (https://portableapps.com/), который не требует установки. AFH 5 лет назад 2
@AFH Я использовал только WinRAR для демонстрации. Я скачал 7z, как вы сказали, и это решает проблему ... но он не совсем переносимый .. Сначала я должен установить его. используя графический интерфейс. Тем не менее, я хочу установить и запустить его из командной строки, поэтому мне нужен один файл download & play 7z.exe или тому подобное. MyWays 5 лет назад 0
Версия на сайте PortableApps полностью переносимая. Его можно запустить либо через интерфейс PA, либо напрямую из каталога `PortableApps \`, который содержит 32- и 64-разрядные версии как графического интерфейса пользователя, так и версии командной строки `7z.exe`, которая, как мне кажется, понадобится или больше файлов `.dll`. AFH 5 лет назад 3
@AFH После установки «7zip portable» с сайта я переместил 7z.exe и 7z.dll в другую папку и удалил основную. Это все еще работало. Это достаточно портативно для меня. Огромное спасибо за помощь. Пожалуйста, напишите то же самое в качестве ответа, чтобы я мог назначить его. MyWays 5 лет назад 0
Это [известная проблема] (https://stackoverflow.com/q/27289115/1025421) с .NET до 4.6.1. PowerShell, конечно, как-то использует более старую версию. Daniel B 5 лет назад 0

1 ответ на вопрос

0
AFH

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

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

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

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

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

Похожие вопросы