En *nix, un enlace simbólico suele ser solo un archivo de texto sin formato con un atributo de "enlace simbólico". El archivo contiene la ruta al destino del vínculo. El atributo "enlace simbólico" no existe en Windows. Entonces, cuando extrae el enlace simbólico en Windows, se convierte en un archivo de texto normal [aunque también puede generar un error, puede depender de la herramienta que use para extraer el archivo]. Cuando se vuelve a copiar a *nix, sigue siendo un archivo de texto normal.
La única solución sería mantener el atributo "enlace simbólico" en algún almacén de metadatos externo y restaurar el atributo al cargar el archivo o crear el archivo.
Aunque no conozco ninguna herramienta que admita esto.
Definitivamente puedes codificar esto.
-
Uso de WinSCP :Haces un código que genera un script WinSCP. El código iteraría recursivamente una estructura de directorio local. Para un archivo generará el
put
Comando para subirlo. Para un enlace simbólico generará elln
comando para crear un enlace simbólico. Para distinguir el enlace simbólico, tal vez pueda usar solo una heurística simple (enlace simbólico =un archivo de texto corto de una línea con barras). Una forma adecuada sería recordar el atributo de enlace simbólico del archivo al extraer el archivo (pero también tendría que codificar la extracción usted mismo, vea también una sugerencia a continuación). -
Uso del archivo :Recientemente implementé esto para un archivo ZIP. (Incluso en Windows) Puede usar el método PHP
ZipArchive::setExternalAttributes
para marcar un archivo archivado como un enlace simbólico. Tenga en cuenta que la función está disponible solo desde PHP 5.6.Código de ejemplo:
$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 está más familiarizado con Python, consulte ¿Cómo configuro permisos (atributos) en un archivo en un archivo ZIP usando el módulo zipfile de Python? Solo se ocupa de los permisos, pero puede extenderlo fácilmente con el bit de enlace simbólico, según mi ejemplo de PHP.
Intentaría mantener el archivo de enlace dentro del archivo gzip (o tar.gz), y solo lo extraería en otro sistema Linux. Sé que Windows generalmente no maneja bien los atributos y permisos de los archivos de Linux, y extraer el enlace en Windows probablemente lo cambie de alguna manera.
O debería ser fácil recrear el enlace simbólico en el nuevo sistema Linux, ya sea en un script automatizado o simplemente copiando y pegando tu ln
personalizado línea en una terminal, como
#!/bin/bash
ln -s TARGET LINKNAME
Todo esto supone que su nuevo sistema Linux tiene el mismo archivo de destino en el mismo lugar que el sistema Linux original.