Zip 文件在 Linux 上用反斜杠展开,没有子目录

vio*_*ite 14 windows linux zip

所以,奇怪的是,我可以解压缩朋友在 Windows 上制作的文件。它发出的东西很奇怪,而且以我以前从未见过的方式不正确。

<base directory stuff>
assets\Changes.txt
assets\DefaultConfig,txt
Run Code Online (Sandbox Code Playgroud)

等等。它显然是一个子目录,但它们作为带有反斜杠的文件出现。

他们在 Windows 上制作它(使用 Compress-Archive powerscript 命令),我尝试在 Linux 上提取它,使用ark来自 KDE的程序和来自 GNOME 的存档管理器。

这里发生了什么?

Kam*_*ski 13

发生这种情况是因为某些 Windows 工具显然使用反斜杠 ( \) 作为分隔符,它们应该使用正斜杠 ( /)。Unix 中的反斜杠可以是文件名或目录名的一部分。

.ZIP 文件格式规范(版本:6.3.5,我写这篇文章时,修订于 2018 年 11 月 20 日)指出:

4.4.17.1 文件名,可选相对路径。存储的路径不得包含驱动器或设备号,或前导斜杠。为了与 Amiga 和 UNIX 文件系统等兼容,所有斜杠必须是正斜杠/而不是反斜杠\。如果输入来自标准输入,则没有文件名字段。

Microsoft 在文档缓解:ZipArchiveEntry.FullName路径分隔符中提到了此文件:

从面向 .NET Framework 4.6.1 的应用程序开始,ZipArchiveEntry.FullName属性中使用的路径分隔符已从.NET Framework 早期\版本中使用的反斜杠 ( )更改为正斜杠 ( /)。[...]

影响

此更改使 .NET 实现符合.ZIP 文件格式规范的第 4.4.17.1 节,并允许在非 Windows 系统上解压缩 .ZIP 档案。

解压缩由在非 Windows 操作系统(如 Macintosh)上针对先前版本 .NET Framework 的应用程序创建的 zip 文件无法保留目录结构。例如,在 Macintosh 上,它创建一组文件,其文件名连接目录路径、任何反斜杠 ( \) 字符和文件名。因此,解压文件的目录结构不会被保留。

请注意,如果归档程序使用了一些旧版本的 .NET Framework,或者它根本不使用它,而是实现了自己的(独立的)zip 文件方法,则可能存在问题。

使用 rar 可能会遇到同样的问题:Unrar 创建的文件在名称中带有反斜杠,而不是正确的目录层次结构

您可能会发现 Unix & Linux SE 上的这个问题很有帮助:Convert a Windows-created ZIP to Linux (internal paths issue)。我的(有点实验性的)方法是在这个答案中


mik*_*dge 8

这实际上是一个错误Microsoft.PowerShell.Archive

https://github.com/PowerShell/Microsoft.PowerShell.Archive/issues/48

...这将在此 PR 中解决,版本 1.2.3

https://github.com/PowerShell/Microsoft.PowerShell.Archive/pull/62

同时,这是一个快速修复(信用):

for file in *\\*; do target="${file//\\//}"; mkdir -p "${target%/*}"; mv -v "$file" "$target"; done
Run Code Online (Sandbox Code Playgroud)

  • 为什么要贬低这个?OP 询问他为什么无法在 PowerShell 上打开由“压缩存档”创建的 zip 文件(“但我想知道为什么会发生这种情况”),这是导致问题的具体错误。接受的答案通常很有用,但这就是确切的原因。 (4认同)
  • 到了 2021 年,我仍然遇到这个问题,即使用 powershell 创建档案时出现反斜杠。伤心。 (2认同)