In Powershell erstellte Zip-Dateien können nicht unter Linux verwendet werden

541
MyWays

Ich habe einen Ordner mit Unterordnern und Dateien. Ich erstelle eine ZIP-Datei über Powershells Compress-Archive.

Das Problem ist, dass die Dateistruktur beim Öffnen in Linux beschädigt wird.

Schlecht ist das in Powershell erstellte bad.zip-Archiv Compress-Archive, und Gut ist gut.zip mit Windows 'WinRAR erstellt.

So sieht es unter Linux aus: (Links ist schlecht, rechts ist gut)

Bild 1

Dateiinhalt in Linux gesehen mit cat: (links ist schlecht, rechts ist gut):

Bild 2

Wie kann dieses Problem behoben werden?

...

Ich habe versucht, alle "\" in bad.zip durch "/" in Nano zu ersetzen, und es hat funktioniert .

Ich habe versucht, das mit diesem Skript zu automatisieren, aber erfolglos:

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

Ich führe das Skript aus:

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

Die umgekehrten Schrägstriche wurden wie vorgesehen ersetzt, new.zip kann jedoch nicht geöffnet werden. Der Grund ist wahrscheinlich die Kodierung ist anders ...

Dies ist die Kodierung für die ZIP-Dateien:

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" und eine Shell-Variable ist eine umständliche Methode für die Konvertierung. In diesem Fall wäre sogar 'tr' falsch, weil Sie das Inhaltsverzeichnis korrigieren müssen, nicht jedoch die binären Daten, bei denen auch Backslashes auftreten können. Ein Katzensprung zur Konsole, um eine Binärdatei zu überprüfen, ist ebenfalls seltsam (Hinweis: `xxd`). Zurück zur Frage: Für eine einzelne Datei kann dies hilfreich sein: [Von Windows erstellte ZIP-Datei in Linux konvertieren (Problem mit internen Pfaden)] (https://unix.stackexchange.com/q/166159/108618). Ich verstehe die beste Lösung, Dateien zu erstellen, die nicht repariert werden müssen. Kamil Maciorowski vor 5 Jahren 0
Sind Sie die einzige Person in diesem Forum? ... Wie auch immer ... Ich kann 7zip nicht unter Windows verwenden, nur das Compress-Archiv von powershell. Ich denke, ich kann die Dateistruktur immer mit einem Skript neu erstellen. MyWays vor 5 Jahren 1
Keine Beleidigung beabsichtigt. Es ist nur so, dass er mir immer hilft .. MyWays vor 5 Jahren 1
Einige Dinge sind falsch: (1) Sie können eine ZIP-Datei nicht bearbeiten, ohne sie zu beschädigen. Dies wird normalerweise durch die Prüfsumme festgestellt. (2) `$ (cat $ 1)` ersetzt eine beliebige Folge von Leerzeichen durch ein Leerzeichen; (3) In den komprimierten Daten sowie im Dateiindex treten Schrägstriche auf, sodass das Ersetzen der Datei die Datei weiter beschädigt. Es ist nicht offensichtlich, warum die "PK" -Zauberzahl hätte ersetzt werden sollen, aber ich würde vermuten, dass Rückgabe-, Leerzeichen- oder Escape-Zeichen in der Binärdatei dafür verantwortlich wären. Wie von @KamilMaciorowski empfohlen, klärt 'xxd', was los ist. AFH vor 5 Jahren 1
"Ich kann 7zip nicht für Windows verwenden, nur das Compress-Archiv von Powershell." - Ja wirklich? Sie haben bereits gesagt, dass Sie WinRAR verwenden können. 7-Zip ist als [Portable App] (https://portableapps.com/) verfügbar, die nicht installiert werden muss. AFH vor 5 Jahren 2
@AFH Ich habe WinRAR nur als Demonstration verwendet. Ich habe 7z heruntergeladen, wie Sie sagten, und es behebt das Problem ... aber es ist nicht genau portabel. Ich muss es zuerst installieren. mit der GUI. Ich möchte es jedoch auf der Kommandozeile installieren und ausführen, daher möchte ich eine einzelne Download & Play 7z.exe-Datei oder ähnliches. MyWays vor 5 Jahren 0
Die Version auf der PortableApps-Website ist vollständig portierbar. Sie kann entweder über die PA-Schnittstelle oder direkt aus dem `PortableApps \` -Verzeichnis gestartet werden, das 32- und 64-Bit-Versionen der GUI- und der `7z.exe'-Befehlszeilenversion enthält, von denen ich denke, dass sie eine benötigt oder mehr der `.dll`-Dateien. AFH vor 5 Jahren 3
@AFH Nach der Installation von '7zip portable' von der Website habe ich 7z.exe und 7z.dll in einen anderen Ordner verschoben und den Hauptordner gelöscht. Es hat immer noch funktioniert. Das ist tragbar genug für mich. Vielen Dank für die Hilfe. Bitte schreibe dasselbe als Antwort, damit ich sie nominieren kann. MyWays vor 5 Jahren 0
Dies ist ein bekanntes Problem (https://stackoverflow.com/q/27289115/1025421) mit .NET vor 4.6.1. PowerShell verwendet natürlich eine ältere Version. Daniel B vor 5 Jahren 0

1 Antwort auf die Frage

0
AFH

Es gibt eine Reihe von Dingen, die bei dem, was Sie versuchen, falsch sind - am wichtigsten: -

  1. Sie können eine ZIP-Datei nicht bearbeiten, ohne sie zu beschädigen: Dies wird normalerweise anhand der Checksumme erkannt und eine beschädigte Datei wird gemeldet.
  2. echo $contents (oder andere Erweiterungsvarianten) ersetzt eine beliebige Folge von Leerzeichen durch ein Leerzeichen.
  3. Schrägstriche treten in den komprimierten Daten sowie im Dateiindex auf. Durch das Ersetzen dieser Daten wird die Datei weiter beschädigt.

Die befriedigendste Antwort ist die Verwendung eines plattformübergreifenden Archivierers wie 7-Zip, der ein Archiv mit generischen Verzeichnisseparatoren speichert und im nativen Format für die Plattform erweitert wird, auf der es aufgerufen wird.

In Windows verwende ich die Portable Apps- Version, die über die PortableApps Suite-Schnittstelle oder direkt von ihrem Verzeichnis aus ausgeführt werden kann. Die portable Version enthält sowohl 32- als auch 64-Bit-Builds und enthält 7z.exedie Befehlszeilenschnittstelle (die möglicherweise eine DLL aus demselben Verzeichnis verwendet).

Es ist nicht offensichtlich, warum in Ihren Protokollen die PKmagische Zahl hätte ersetzt werden müssen, aber ich würde vermuten, dass Rückgabe-, Leerzeichen oder Escape-Zeichen in der Binärdatei dafür verantwortlich sein könnten. Wie Kamil Maciorowski in seinem Kommentar empfiehlt, xxdwird geklärt, was passiert ist.