Itu terjadi karena beberapa alat Windows ternyata menggunakan garis miring terbalik (\
) sebagai pemisah di mana mereka harus menggunakan garis miring ke depan (/
). Backslash di Unix bisa menjadi bagian dari nama file atau direktori.
Spesifikasi Format File .ZIP (versi:6.3.5 saat saya menulis ini, direvisi 20 November 2018) menyatakan:
4.4.17.1 Nama file, dengan jalur relatif opsional. Jalur yang disimpan TIDAK BOLEH berisi drive atau huruf perangkat, atau garis miring di depan. Semua garis miring HARUS berupa garis miring ke depan
/
sebagai kebalikan dari garis miring ke belakang\
untuk kompatibilitas dengan sistem file Amiga dan UNIX, dll. Jika input berasal dari input standar, tidak ada kolom nama file.
File ini disebutkan oleh Microsoft dalam dokumen Mitigation:ZipArchiveEntry.FullName
Pemisah Jalur:
Dimulai dengan aplikasi yang menargetkan .NET Framework 4.6.1, pemisah jalur yang digunakan dalam
ZipArchiveEntry.FullName
properti telah berubah dari garis miring terbalik (\
) yang digunakan di versi .NET Framework sebelumnya ke garis miring (/
). [...]Dampak
Perubahan tersebut membuat implementasi .NET sesuai dengan bagian 4.4.17.1 dari Spesifikasi Format File .ZIP dan memungkinkan arsip .ZIP didekompresi pada sistem non-Windows.
Dekompresi file zip yang dibuat oleh aplikasi yang menargetkan versi .NET Framework sebelumnya pada sistem operasi non-Windows seperti Macintosh gagal mempertahankan struktur direktori. Misalnya, pada Macintosh, ia membuat satu set file yang nama filenya menggabungkan jalur direktori, bersama dengan garis miring terbalik (
\
) karakter, dan nama file. Akibatnya, struktur direktori file yang didekompresi tidak dipertahankan.
Perhatikan bahwa masalah mungkin ada jika pengarsip menggunakan beberapa versi lama .NET Framework atau jika tidak menggunakannya sama sekali tetapi menerapkan pendekatannya sendiri (independen) untuk file zip.
Seseorang mungkin mengalami masalah yang sama dengan rar:Unrar membuat file dengan garis miring terbalik pada nama, bukan hierarki direktori yang tepat.
Anda mungkin menemukan pertanyaan ini di Unix &Linux SE bermanfaat:Mengonversi ZIP buatan Windows ke Linux (masalah jalur internal). Pendekatan saya (agak eksperimental) ada di jawaban ini.
Ini sebenarnya bug di Microsoft.PowerShell.Archive
:
https://github.com/PowerShell/Microsoft.PowerShell.Archive/issues/48
...yang akan diselesaikan dalam PR ini, dijadwalkan untuk versi 1.2.3:
https://github.com/PowerShell/Microsoft.PowerShell.Archive/pull/62
Sementara itu, ini adalah perbaikan cepat (kredit):
for file in *\\*; do target="${file//\\//}"; mkdir -p "${target%/*}"; mv -v "$file" "$target"; done