我有一个包含子文件夹和文件的文件夹。我通过 powershell 创建一个 .zip 文件Compress-Archive
。
问题是在 Linux 中打开时文件结构混乱。
Bad 是使用 Powershell 制作的 bad.zip 档案Compress-Archive
,而 Good 是使用 Windows 的 WinRAR 制作的 good.zip。
在 Linux 上它看起来是这样的:(左边是坏的,右边是好的)
在 Linux 中看到的文件内容cat
:(左边是坏的,右边是好的):
如何解决这个问题?
...
我尝试将 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
您正在尝试做的事情存在许多错误 - 最重要的是:-
- 您无法编辑 zip 文件,否则会损坏它:这通常会通过其校验和检测出来,并报告损坏的文件。
echo $contents
(或其他扩展变体)将用单个空格替换任何空格字符序列。- 反斜杠会出现在压缩数据以及文件索引中,因此替换它们会进一步损坏文件。
最令人满意的答案是使用跨平台归档器,例如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