In *nix un collegamento simbolico è in genere solo un semplice file di testo con un attributo "link simbolico". Il file contiene il percorso della destinazione del collegamento. L'attributo "link simbolico" non esiste su Windows. Quindi, quando estrai il collegamento simbolico su Windows, diventa un normale file di testo [sebbene possa anche causare errori, potrebbe dipendere da uno strumento che usi per estrarre l'archivio]. Quando viene ricopiato in *nix, rimane un normale file di testo.
L'unica soluzione sarebbe mantenere l'attributo "link simbolico" in un archivio di metadati esterno e ripristinare l'attributo durante il caricamento del file o la creazione dell'archivio.
Anche se non sono a conoscenza di alcuno strumento che lo supporti.
Puoi sicuramente codificare questo.
-
Utilizzando WinSCP :Si crea un codice che genera lo script WinSCP. Il codice itererebbe in modo ricorsivo una struttura di directory locale. Per un file genererà il
put
comando per caricarlo. Per un collegamento simbolico genererà illn
comando per creare un collegamento simbolico. Per distinguere il collegamento simbolico, puoi forse usare solo una semplice euristica (link simbolico =un breve file di testo di una riga con barre). Un modo corretto sarebbe quello di ricordare l'attributo link simbolico del file durante l'estrazione dell'archivio (ma dovresti anche codificare tu stesso l'estrazione, vedi anche un suggerimento sotto). -
Utilizzo dell'archivio :Recentemente l'ho implementato per un archivio ZIP. (Anche su Windows) Puoi usare il metodo PHP
ZipArchive::setExternalAttributes
per contrassegnare un file archiviato come collegamento simbolico. Si noti che la funzione è disponibile solo da PHP 5.6.Codice di esempio:
$symlink = true; // is symlink? $dir = false; // is folder? $mode = "755"; // permissions $local_path = "C:\\zip\\folder\\mylink"; $zip_path = "folder/mylink"; $attr = (1 << 14) | // this bit seems to be always set (1 << ($dir ? 30 : 31)) | ($symlink ? (1 << 29) : 0) | octdec($mode) << 16; $zip->addFile($local_path, $zip_path); $zip->setExternalAttributesName($zip_path, ZipArchive::OPSYS_UNIX, $attr);
Se hai più familiarità con Python, vedi Come posso impostare i permessi (attributi) su un file in un file ZIP usando il modulo zipfile di Python? Si occupa solo delle autorizzazioni, ma puoi facilmente estenderlo con il bit di collegamento simbolico, come nel mio esempio PHP.
Proverei a mantenere il file di collegamento all'interno dell'archivio gzip (o tar.gz) ed estrarlo solo su un altro sistema Linux. So che Windows generalmente non gestisce bene gli attributi e i permessi dei file Linux, e l'estrazione del collegamento su Windows probabilmente lo cambia in qualche modo.
Oppure dovrebbe essere facile ricreare il collegamento simbolico sul nuovo sistema Linux, in uno script automatico o semplicemente copiando e incollando il tuo ln
personalizzato line in un terminale, come
#!/bin/bash
ln -s TARGET LINKNAME
Tutto ciò presuppone che il tuo nuovo sistema Linux abbia lo stesso file di destinazione nella stessa posizione del sistema Linux originale.