Succede perché alcuni strumenti di Windows usano apparentemente barre rovesciate (\
) come separatori dove dovrebbero usare le barre (/
). La barra rovesciata in Unix può far parte del nome di un file o di una directory.
.ZIP File Format Specification (versione:6.3.5 quando sto scrivendo questo, rivista il 20 novembre 2018) afferma:
4.4.17.1 Il nome del file, con percorso relativo facoltativo. Il percorso memorizzato NON DEVE contenere una lettera di unità o dispositivo o una barra iniziale. Tutte le barre DEVONO essere barre in avanti
/
al contrario delle barre rovesciate\
per la compatibilità con i file system Amiga e UNIX ecc. Se l'input proviene da standardinput, non c'è il campo del nome del file.
Questo file è menzionato da Microsoft in un documento Mitigation:ZipArchiveEntry.FullName
Separatore di percorso:
A partire dalle app destinate a .NET Framework 4.6.1, il separatore di percorso utilizzato in
ZipArchiveEntry.FullName
proprietà è stata modificata dalla barra rovesciata (\
) utilizzato nelle versioni precedenti di .NET Framework in una barra (/
). [...]Impatto
La modifica rende l'implementazione di .NET conforme alla sezione 4.4.17.1 della specifica del formato di file .ZIP e consente la decompressione degli archivi .ZIP su sistemi non Windows.
La decompressione di un file zip creato da un'app destinata a una versione precedente di .NET Framework su sistemi operativi diversi da Windows come Macintosh non riesce a preservare la struttura della directory. Ad esempio, su Macintosh, crea un insieme di file il cui nome file concatena il percorso della directory, insieme a qualsiasi barra rovesciata (
\
) e il nome del file. Di conseguenza, la struttura delle directory dei file decompressi non viene preservata.
Nota che il problema potrebbe esistere se l'archiviatore utilizzava una vecchia versione di .NET Framework o se non lo utilizzava affatto ma implementava il proprio approccio (indipendente) ai file zip.
Si potrebbe riscontrare lo stesso problema con rar:Unrar crea file con barre rovesciate nei nomi invece della corretta gerarchia di directory.
Potresti trovare utile questa domanda su Unix e Linux SE:Converti un ZIP creato da Windows in Linux (problema di percorsi interni). Il mio approccio (in qualche modo sperimentale) è in questa risposta.
Questo è in realtà un bug in Microsoft.PowerShell.Archive
:
https://github.com/PowerShell/Microsoft.PowerShell.Archive/issues/48
...che verrà risolto in questo PR, previsto per la versione 1.2.3:
https://github.com/PowerShell/Microsoft.PowerShell.Archive/pull/62
Nel frattempo, questa è una soluzione rapida (credito):
for file in *\\*; do target="${file//\\//}"; mkdir -p "${target%/*}"; mv -v "$file" "$target"; done