これは、一部の Windows ツールがバックスラッシュ (\
) を使用しているように見えるために発生します。 ) スラッシュ (/
) を使用する必要がある区切り記号として )。 Unix のバックスラッシュは、ファイルまたはディレクトリ名の一部にすることができます。
.ZIP ファイル形式の仕様 (これを書いているときのバージョン:6.3.5、2018 年 11 月 20 日に改訂) には次のように記載されています。
<ブロック引用>
4.4.17.1 オプションの相対パスを含むファイルの名前。保存されるパスには、ドライブ文字、デバイス文字、または先頭のスラッシュを含めてはなりません。すべてのスラッシュはスラッシュ /
でなければなりません 逆スラッシュ \
とは対照的に Amiga や UNIX ファイル システムなどとの互換性のためです。入力が標準入力から来た場合、ファイル名フィールドはありません。
このファイルは、Microsoft のドキュメント Mitigation: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 に関するこの質問が役立つ場合があります:Convert a Windows-created ZIP to Linux (internal paths issue)。私の(やや実験的な)アプローチは、この回答にあります。
これは実際には Microsoft.PowerShell.Archive
のバグです :
https://github.com/PowerShell/Microsoft.PowerShell.Archive/issues/48
...これは、バージョン 1.2.3 で予定されているこの PR で解決されます:
https://github.com/PowerShell/Microsoft.PowerShell.Archive/pull/62
それまでの間、これは簡単な修正です (クレジット):
for file in *\\*; do target="${file//\\//}"; mkdir -p "${target%/*}"; mv -v "$file" "$target"; done