奇妙なことに、私は友人がWindowsで作成したファイルを解凍できます。それが与えるものは奇妙で、私が今まで見たことのない方法で間違っています。
<base directory stuff>
assets\Changes.txt
assets\DefaultConfig,txt
等々。これは明らかにサブディレクトリであることを意味しますが、バックスラッシュを含むファイルとして出力されます。
彼らはそれをWindowsで(Compress-Archive powerscriptコマンドを使用して)作成しました。KDEのark
プログラムとGNOMEのアーカイブマネージャーの両方を使用して、Linuxで抽出しようとしました。
何が起きてる?
一部の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に変換します(内部パスの問題) 。私の(やや実験的な)アプローチは この回答では です。
これは実際には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