web-dev-qa-db-ja.com

Linuxでは、Zipファイルはバックスラッシュで展開され、サブディレクトリはありません

奇妙なことに、私は友人がWindowsで作成したファイルを解凍できます。それが与えるものは奇妙で、私が今まで見たことのない方法で間違っています。

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

等々。これは明らかにサブディレクトリであることを意味しますが、バックスラッシュを含むファイルとして出力されます。

彼らはそれをWindowsで(Compress-Archive powerscriptコマンドを使用して)作成しました。KDEのarkプログラムとGNOMEのアーカイブマネージャーの両方を使用して、Linuxで抽出しようとしました。

何が起きてる?

6
jaked122

一部のWindowsツールでは、スラッシュ(\)を使用する必要がある場合、セパレーターとしてバックスラッシュ(/)を使用しているようです。 Unixのバックスラッシュは、ファイル名またはディレクトリ名の一部にすることができます。

。Zipファイル形式仕様 (バージョン:6.3.5これを書いているとき、2018年11月20日改訂)には次のように記載されています。

4.4.17.1オプションの相対パスを使用したファイルの名前。保存されたパスには、ドライブまたはデバイスの文字、または先頭のスラッシュを含めることはできません。すべてのスラッシュは、スラッシュ/とは対照的に、スラッシュ\である必要があります。

このファイルはMicrosoftのドキュメントで言及されています 緩和:ZipArchiveEntry.FullNameパス区切り文字

.NET Framework 4.6.1をターゲットとするアプリから、ZipArchiveEntry.FullNameプロパティで使用されるパス区切り文字は、.NET Frameworkの以前のバージョンで使用されていたバックスラッシュ(\)からスラッシュに変更されました(/)。 [...]

影響

この変更により、.NET実装が 。Zipファイル形式の仕様 のセクション4.4.17.1に準拠し、Windows以外のシステムで.Zipアーカイブを解凍できるようになりました。

Macintoshなどの非Windowsオペレーティングシステムで以前のバージョンの.NET Frameworkを対象とするアプリによって作成されたZipファイルを解凍すると、ディレクトリ構造を保持できません。たとえば、Macintoshでは、ファイル名がディレクトリパスとバックスラッシュ(\)文字およびファイル名を連結した一連のファイルを作成します。その結果、解凍されたファイルのディレクトリ構造は保持されません。

アーカイバが古いバージョンの.NET Frameworkを使用した場合、またはアーカイバがまったく使用せずにZipファイルに独自の(独立した)アプローチを実装した場合、問題が存在する可能性があることに注意してください。

Rarで同じ問題が発生する可能性があります: 適切なディレクトリ階層ではなく、名前にバックスラッシュを含むファイルを作成するUnrar

この質問は、UnixおよびLinux SEで役立ちます: Windowsで作成されたZipをLinuxに変換します(内部パスの問題) 。私の(やや実験的な)アプローチは この回答では です。

6

これは実際にはMicrosoft.PowerShell.Archiveのバグです:

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

...このPRで解決される予定です バージョン1.2.

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

それまでの間、これは簡単な修正です( credit ):

for file in *\\*; do target="${file//\\//}"; mkdir -p "${target%/*}"; mv -v "$file" "$target"; done
3
mikebridge