Dans *nix, un lien symbolique est généralement un simple fichier texte avec un attribut "symlink". Le fichier contient le chemin vers la cible du lien. L'attribut "symlink" n'existe pas sous Windows. Ainsi, lorsque vous extrayez le lien symbolique sous Windows, il devient un fichier texte normal [bien qu'il puisse également y avoir une erreur, cela peut dépendre d'un outil que vous utilisez pour extraire l'archive]. Lorsqu'il est recopié dans *nix, il reste un fichier texte normal.
La seule solution serait de conserver l'attribut "symlink" dans un magasin de métadonnées externe et de restaurer l'attribut lors du téléchargement du fichier ou de la création de l'archive.
Bien que je ne connaisse aucun outil prenant en charge cela.
Vous pouvez certainement coder ceci.
-
Utiliser WinSCP :Vous créez un code qui génère un script WinSCP. Le code itérerait de manière récursive une structure de répertoires locaux. Pour un fichier, il générera le
put
commande pour le télécharger. Pour un lien symbolique, il générera leln
commande pour créer un lien symbolique. Pour distinguer le lien symbolique, vous pouvez peut-être utiliser une simple heuristique (lien symbolique =un court fichier texte d'une ligne avec des barres obliques). Une méthode appropriée serait de se souvenir de l'attribut de lien symbolique du fichier lors de l'extraction de l'archive (mais vous devrez également coder l'extraction vous-même, voir également un indice ci-dessous). -
Utiliser les archives :Je l'ai récemment implémenté pour une archive ZIP. (Même sous Windows) Vous pouvez utiliser la méthode PHP
ZipArchive::setExternalAttributes
pour marquer un fichier archivé comme un lien symbolique. Notez que la fonction est disponible depuis PHP 5.6 uniquement.Exemple de code :
$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);
Si vous êtes plus familier avec Python, consultez Comment définir des autorisations (attributs) sur un fichier dans un fichier ZIP à l'aide du module zipfile de Python ? Il ne traite que des autorisations, mais vous pouvez facilement l'étendre avec le bit de lien symbolique, comme dans mon exemple PHP.
J'essaierais de conserver le fichier de lien dans l'archive gzip (ou tar.gz) et de ne l'extraire que sur un autre système Linux. Je sais que Windows ne gère généralement pas bien les attributs et les autorisations des fichiers Linux, et l'extraction du lien sur Windows le modifie probablement d'une manière ou d'une autre.
Ou il devrait être facile de recréer le lien symbolique sur le nouveau système Linux, soit dans un script automatisé, soit simplement en copiant et collant votre ln
personnalisé ligne dans un terminal, comme
#!/bin/bash
ln -s TARGET LINKNAME
Tout cela suppose que votre nouveau système Linux a le même fichier cible au même endroit que le système Linux d'origine.