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.
-
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 derln
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). -
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.