V *nix je symbolický odkaz obvykle pouze prostý textový soubor s atributem „symlink“. Soubor obsahuje cestu k cíli odkazu. Atribut "symlink" v systému Windows neexistuje. Když tedy symbolický odkaz rozbalíte ve Windows, stane se z něj běžný textový soubor [i když může také dojít k chybě, může to záviset na nástroji, který k rozbalení archivu používáte]. Při zkopírování zpět do *nix zůstane běžným textovým souborem.
Jediným řešením by bylo ponechat atribut „symlink“ v nějakém externím úložišti metadat a obnovit atribut při nahrávání souboru nebo vytváření archivu.
I když si nejsem vědom žádného nástroje, který by to podporoval.
Určitě to můžete kódovat.
-
Pomocí WinSCP :Vytvoříte kód, který generuje skript WinSCP. Kód by rekurzivně iteroval místní adresářovou strukturu. Pro soubor to vygeneruje
put
příkaz k nahrání. Pro symbolický odkaz vygenerujeln
příkaz k vytvoření symbolického odkazu. K rozlišení symbolického odkazu lze možná použít jen jednoduchou heuristiku (symlink =krátký jednořádkový textový soubor s lomítky). Správným způsobem by bylo zapamatovat si atribut symbolického odkazu souboru při rozbalování archivu (ale pak byste museli extrakci nakódovat sami, viz také nápověda níže). -
Pomocí archivu :Nedávno jsem to implementoval pro archiv ZIP. (I ve Windows) Můžete použít PHP metodu
ZipArchive::setExternalAttributes
označit archivovaný soubor jako symbolický odkaz. Všimněte si, že funkce je dostupná pouze od PHP 5.6.Ukázkový kód:
$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);
Pokud jste s Pythonem obeznámeni, přečtěte si článek Jak nastavím oprávnění (atributy) u souboru v souboru ZIP pomocí modulu zipfile v Pythonu? Zabývá se pouze oprávněními, ale můžete jej snadno rozšířit pomocí bitu symbolického odkazu, jako v mém příkladu PHP.
Pokusil bych se ponechat soubor odkazu v archivu gzip (nebo tar.gz) a extrahovat jej pouze na jiném linuxovém systému. Vím, že systém Windows obecně nezpracovává atributy a oprávnění souborů linux dobře a extrahování odkazu ve Windows to pravděpodobně nějak změní.
Nebo by mělo být snadné znovu vytvořit symbolický odkaz v novém linuxovém systému, buď v automatickém skriptu, nebo stačí zkopírovat a vložit vlastní ln
linka do terminálu, jako
#!/bin/bash
ln -s TARGET LINKNAME
To vše za předpokladu, že váš nový linuxový systém má stejný cílový soubor na stejném místě jako původní linuxový systém.