GNU/Linux >> Znalost Linux >  >> Linux

Jak zkopírovat soubor symbolického odkazu z Linuxu do Windows a pak zpět do Linuxu, ale stále jej zachovat jako symbolický odkaz

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.

  1. 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 vygeneruje ln 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).

  2. 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.


Linux
  1. Jak zkopírovat oprávnění a vlastnictví souboru do jiného souboru v Linuxu

  2. Jak odstranit soubory a adresáře v Linuxu z příkazového řádku

  3. Jak rozdělit a kombinovat soubory z příkazového řádku v Linuxu

  1. Jak vytvořit pevné a symbolické odkazy v Linuxu

  2. Jak kopírovat nebo klonovat oprávnění z jednoho souboru do druhého v systému Linux

  3. Co jsou symbolické odkazy (Soft Links) a jak je vytvořit pod Linuxem

  1. Jak mohu symbolicky propojit soubor v Linuxu?

  2. pscp zkopírujte soubor vzdáleně z Windows do Linuxu

  3. Jak zkopíruji soubor/složku z domovského adresáře jiného uživatele v Linuxu?