GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So kopieren Sie eine symbolische Linkdatei von Linux nach Windows und dann zurück nach Linux, behalten sie aber weiterhin als symbolischen Link bei

In *nix ist ein Symlink normalerweise nur eine einfache Textdatei mit einem "Symlink"-Attribut. Die Datei enthält den Pfad zum Verknüpfungsziel. Das Attribut "Symlink" existiert unter Windows nicht. Wenn Sie also den Symlink unter Windows extrahieren, wird er zu einer normalen Textdatei [obwohl es auch Fehler geben kann, kann dies von einem Tool abhängen, das Sie zum Extrahieren des Archivs verwenden]. Wenn es nach *nix zurückkopiert wird, bleibt es eine normale Textdatei.

Die einzige Lösung wäre, das "symlink"-Attribut in einem externen Metadatenspeicher zu behalten und das Attribut beim Hochladen der Datei oder beim Erstellen des Archivs wiederherzustellen.

Obwohl mir kein Tool bekannt ist, das dies unterstützt.

Du kannst das definitiv codieren.

  1. WinSCP verwenden :Sie erstellen einen Code, der ein WinSCP-Skript generiert. Der Code würde rekursiv eine lokale Verzeichnisstruktur durchlaufen. Für eine Datei wird der put generiert Befehl zum Hochladen. Für einen Symlink wird der ln generiert Befehl zum Erstellen eines Symlinks. Um den Symlink zu unterscheiden, können Sie vielleicht nur eine einfache Heuristik verwenden (Symlink =eine kurze einzeilige Textdatei mit Schrägstrichen). Ein geeigneter Weg wäre, sich beim Extrahieren des Archivs das Datei-Symlink-Attribut zu merken (aber Sie müssten die Extraktion dann auch selbst codieren, siehe auch einen Hinweis unten).

  2. Archiv verwenden :Ich habe dies kürzlich für ein ZIP-Archiv implementiert. (Auch unter Windows) Sie können die PHP-Methode ZipArchive::setExternalAttributes verwenden um eine archivierte Datei als Symlink zu kennzeichnen. Beachten Sie, dass die Funktion erst seit PHP 5.6 verfügbar ist.

    Beispielcode:

    $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);
    

    Wenn Sie mit Python besser vertraut sind, lesen Sie Wie lege ich Berechtigungen (Attribute) für eine Datei in einer ZIP-Datei mit dem ZIP-Modul von Python fest? Es befasst sich nur mit Berechtigungen, aber Sie können es einfach mit dem Symlink-Bit erweitern, wie in meinem PHP-Beispiel.


Ich würde versuchen, die Linkdatei im gzip- (oder tar.gz-) Archiv aufzubewahren und sie nur auf einem anderen Linux-System zu extrahieren. Ich weiß, dass Windows im Allgemeinen nicht gut mit Linux-Dateiattributen und -berechtigungen umgeht, und das Extrahieren des Links unter Windows ändert es wahrscheinlich irgendwie.

Oder es sollte einfach sein, den Symlink auf dem neuen Linux-System neu zu erstellen, entweder in einem automatisierten Skript oder kopieren Sie einfach Ihren benutzerdefinierten ln und fügen Sie ihn ein Zeile in ein Terminal, wie

#!/bin/bash
ln -s TARGET LINKNAME

Diese gehen alle davon aus, dass Ihr neues Linux-System dieselbe Zieldatei an derselben Stelle wie das ursprüngliche Linux-System hat.


Linux
  1. So kopieren Sie Dateiberechtigungen und Eigentumsrechte in eine andere Datei in Linux

  2. So löschen Sie Dateien und Verzeichnisse in Linux über die Befehlszeile

  3. So teilen und kombinieren Sie Dateien von der Befehlszeile in Linux

  4. So kopieren oder klonen Sie Berechtigungen von einer Datei in eine andere unter Linux

  5. Wie kopiere ich eine Datei/einen Ordner aus dem Home-Verzeichnis eines anderen Benutzers in Linux?

So verknüpfen Sie eine Datei unter Linux per Symlink

So kopieren Sie Dateien und Verzeichnisse im Linux-Terminal

Was sind symbolische Links in Linux? Wie erstellt man symbolische Links?

Wie verbinde ich mich mit Linux VPS über SSH von Linux und Windows OS?

So konvertieren Sie eine .pem-Datei in eine .ppk-Datei unter Windows und Linux

So installieren Sie Java 8 JRE und JDK aus einer RPM-Datei unter Linux