Powershell 创建的 Zip 文件无法在 Linux 中使用

Powershell 创建的 Zip 文件无法在 Linux 中使用

我有一个包含子文件夹和文件的文件夹。我通过 powershell 创建一个 .zip 文件Compress-Archive

问题是在 Linux 中打开时文件结构混乱。

Bad 是使用 Powershell 制作的 bad.zip 档案Compress-Archive,而 Good 是使用 Windows 的 WinRAR 制作的 good.zip。

在 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. 您无法编辑 zip 文件,否则会损坏它:这通常会通过其校验和检测出来,并报告损坏的文件。
  2. echo $contents(或其他扩展变体)将用单个空格替换任何空格字符序列。
  3. 反斜杠会出现在压缩数据以及文件索引中,因此替换它们会进一步损坏文件。

最令人满意的答案是使用跨平台归档器,例如7-Zip,它将保存一个带有通用目录分隔符的档案,并以调用它的平台的本机格式进行扩展。

在 Windows 中我使用便携式应用程序版本,可以通过 PortableApps Suite 界面运行,也可以直接从其目录运行;便携版本包含 32 位和 64 位版本,并包括7z.exe命令行界面(可能使用来自同一目录的 DLL)。

在您的日志中,为什么应该替换魔法数字并不明显PK,但我猜想二进制文件中的回车符、退格符或转义符可以解释这一点。正如 Kamil Maciorowski 在他的评论中所建议的那样,xxd将澄清发生了什么。

答案2

通过调用 7zip 实用程序替换 Powershell Compress-Archive(下载第三方)

$folderPathToZip = "C:\MyFolder"
$fileName = "myFolderZipped.zip"
$DestPath = "C:\Destination\Path"
$DestPathPlusFile= "$DestPath\$fileName"

# CHANGE THIS POWERSHELL:
Compress-Archive -Path:"$folderPathToZip\" -DestinationPath:"$DestPathPlusFile" -Force
 
# TO THIS:
& "C:\Program Files\7-Zip\7z.exe" a -tzip -o"$DestPath\" "$fileName" "$folderPathToZip\" -aoa
# a     = archive
# tzip  = normal .zip compression style
# -o    = DestinationPath
# -aoa  = Force

相关内容