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

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

奇怪的是,我可以解压朋友在 Windows 上制作的文件。它给出的结果很奇怪,而且是我以前从未见过的不正确的结果。

<base directory stuff>
assets\Changes.txt
assets\DefaultConfig,txt

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

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

这里发生了什么?

答案1

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

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

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

微软在一份文档中提到了这个文件缓解措施:ZipArchiveEntry.FullName路径分隔符

从针对 .NET Framework 4.6.1 的应用开始,属性中使用的路径分隔符已从.NET Framework 以前版本中使用的ZipArchiveEntry.FullName反斜杠 ( ) 更改为正斜杠( )。[...]\/

影响

这一变化使 .NET 实现符合.ZIP 文件格式规范并允许在非 Windows 系统上解压 .ZIP 档案。

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

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

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

您可能会发现有关 Unix 和 Linux SE 的这个问题很有帮助:将 Windows 创建的 ZIP 转换为 Linux(内部路径问题)。我的(有点实验性的)方法是在这个答案中

答案2

这实际上是一个错误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

相关内容