cygwin mingw symlink ntfs ln

Habilitar enlaces simbólicos nativos de NTFS para Cygwin



mingw symlink (4)

NTFS reciente y Windows implementan enlaces simbólicos:

  • El punto de unión NTFS se puede utilizar como enlace simbólico de directorio desde NTFS 3.0 (Windows 2000) mediante el linkd herramientas de junction o junction .
  • El enlace simbólico de NTFS también se puede usar como enlace simbólico (tanto para archivos como para directorios) desde Windows Vista con la herramienta mklink .

Pero en Cygwin 1.7 (instalado en Windows 7), ln -s crea un archivo de texto.

en Cygwin:

$ ln -s -v target mylink `mylink'' -> `target''

en MinGW (o su editor favorito):

$ cat mylink !<symlink>ÿþt a r g e t

¿Es posible decirle a Cygwing que use el punto de unión NTFS o el enlace simbólico de NTFS ?

otra pregunta: ¿Está esto disponible en MinGW?


⸻⸻⸻ Respuesta corta ⸻⸻⸻

Definir variable de entorno:

CYGWIN=winsymlinks:nativestrict

Como lo señaló mwm es posible que también deba ejecutar bash como administrador.

⸻⸻⸻ Respuesta larga ⸻⸻⸻

Los enlaces simbólicos de Cygwin predeterminados son solo archivos normales

Por defecto, Cygwin crea archivos de texto como solución alternativa para la falla del enlace simbólico de Windows. Estos archivos no son realmente symlinks . Casi todos los programas de Windows no consideran estos archivos como enlaces simbólicos.

Los enlaces simbólicos nativos están disponibles en las versiones recientes de Windows

NTFS reciente y Windows implementan enlaces simbólicos:

  • El punto de unión NTFS se puede utilizar como enlace simbólico de directorio desde NTFS 3.0 (Windows 2000) mediante el linkd herramientas de junction o junction .
  • El enlace simbólico de NTFS también se puede usar como enlace simbólico (tanto para archivos como para directorios) desde Windows Vista con la herramienta mklink .

Cygwin puede crear enlaces simbólicos NTFS nativos

Extracto simplificado de la documentación de Cygwin :

Enlaces simbolicos

[...]

Cygwin crea enlaces simbólicos potencialmente de múltiples maneras diferentes:

  • Los enlaces simbólicos predeterminados son archivos simples que contienen una cookie mágica seguida de la ruta a la que apunta el enlace. [...]

  • Los enlaces simbólicos de estilo de acceso directo se crean en Windows .lnk [...] si la variable de entorno CYGWIN [...] está configurada para contener la cadena winsymlinks o winsymlinks:lnk . [...]

  • Los enlaces simbólicos nativos de Windows solo se crean en Windows Vista / 2008 y posteriores, y solo en sistemas de archivos que admiten puntos de análisis. Debido a sus extrañas restricciones y comportamiento, solo se crean si el usuario solicita explícitamente crearlas. Esto se hace configurando la variable de entorno CYGWIN para que contenga la cadena winsymlinks:native o winsymlinks:nativestrict . [...]

  • En el sistema de archivos NFS, Cygwin siempre crea enlaces simbólicos reales de NFS.

Configurando Cygwin

La Guía del usuario de Cygwin presenta la variable CYGWIN y la opción winsymlinks :

La variable de entorno CYGWIN se usa para configurar muchas configuraciones globales [...]. Contiene las opciones enumeradas a continuación, separadas por caracteres en blanco. [...]

  • [...]
  • [...]
  • [...]
  • [...]
  • winsymlinks:{lnk,native,nativestrict} - si está configurado solo para winsymlinks o winsymlinks:lnk , Cygwin crea enlaces simbólicos como accesos directos de Windows con un encabezado especial y el conjunto de atributos R / O.

    Si se establece en winsymlinks:native o winsymlinks:nativestrict , Cygwin crea enlaces simbólicos como enlaces simbólicos nativos de Windows en sistemas de archivos y versiones del sistema operativo que los admiten. Si se sabe que el sistema operativo no admite enlaces simbólicos nativos (Windows XP, Windows Server 2003), se genera un mensaje de advertencia una vez por sesión.

    La diferencia entre winsymlinks:native y winsymlinks:nativestrict es esta: si el sistema de archivos admite enlaces simbólicos nativos y Cygwin no logra crear un enlace simbólico nativo por alguna razón, recurrirá a la creación de enlaces simbólicos predeterminados de Cygwin con enlaces simbólicos winsymlinks:native , mientras que con winsymlinks:nativestrict la llamada al sistema symlink(2) fallará inmediatamente.

CYGWIN=winsymlinks:native
siempre crea un enlace, pero utiliza un repliegue de Cygwin cuando el objetivo no existe

en Cygwin:

$ export CYGWIN="winsymlinks:native" $ ln -s -v target mylink `mylink'' -> `target'' $ echo content > target

en MinGW:

$ cat mylink content

Las personas que usan los programas de Windows y Cygwin pueden tener problemas cuando se crea un enlace simbólico como un archivo ficticio (falla de Cygwin cuando falta el objetivo) ...

CYGWIN=winsymlinks:nativestrict
siempre usa el enlace simbólico nativo de Windows pero falla cuando el objetivo no existe

en Cygwin:

$ export CYGWIN="winsymlinks:nativestrict" $ rm -f a b $ ln -sv a b ln: failed to create symbolic link `b'': No such file or directory $ touch b $ ln -sv a b ln: failed to create symbolic link `b'': File exists $ rm b $ touch a $ ln -sv a b `b'' -> `a''

Debido a que nativestrict requiere que el destino exista antes de la creación del enlace simbólico, algunos comandos / scripts pueden fallar al crear un enlace.

Nota: solo los administradores tienen la capacidad de crear enlaces simbólicos de NT nativos, por lo que, bajo Windows UAC, el emulador de terminal de Cygwin (mintty) debe ejecutarse con privilegios elevados (haga clic con el botón derecho en el acceso directo y elija Ejecutar como administrador o establezca la propiedad de los accesos directos de menta, Avanzado → Ejecutar como administrador ).

Un agradecimiento especial a Guria y Spooky por sus contribuciones.


La respuesta aceptada es correcta, dos pequeñas notas laterales.

Si solo te importan los enlaces simbólicos que creas en la línea de comandos, instala cygutils-extra paquete cygutils-extra , incluye un comando winln , que tiene la misma sintaxis que ln , pero crea enlaces nativos de Windows. Cree un alias: alias ln=winln (solo funciona en shell interactivo), o incluso reemplace el archivo ln con winln (también funciona en scripts de shell), pero puede que se sobrescriba la próxima vez que se actualice el paquete coreutils .

Solo descubrí que es posible usar enlaces simbólicos nativos cuando ya tenía Cygwin instalado, y también agregué algunos enlaces simbólicos. Entonces, después de configurar CYGWIN=winsymlinks:native como variable de entorno de mi sistema, quise convertir todos los enlaces no nativos existentes a nativos. Esto es lo que hice.

Por si acaso, primero haga una copia de seguridad de todo su directorio de Cygwin.

Encuentre todos los enlaces simbólicos y guarde la lista en el archivo /links : cd /; find . -regextype egrep -regex ''./(dev|proc|mnt|cygdrive)'' -prune -o -type l -print >links cd /; find . -regextype egrep -regex ''./(dev|proc|mnt|cygdrive)'' -prune -o -type l -print >links

Revisar links . Cree un archivo tar con todos los enlaces: tar c --files-from=links >links.tar

Extraiga el archivo tar : tar x --files-from=links <links.tar Como los enlaces simbólicos nativos ahora están habilitados, tar sobrescribirá los enlaces simbólicos de Cygwin anteriores con enlaces simbólicos nativos.

Limpiar: rm -f links links.tar

PS Al principio usé CYGWIN=winsymlinks:nativestrict , pero luego descubrí que en este modo, ln -s target link falla si el target no existe. En contraste, native creará un enlace de link simbólico Cygwin (no nativo) que apunta al target inexistente, lo que coincide con el comportamiento de ln en los sistemas UNIX. En casos excepcionales, nativestrict puede romper algunos programas o scripts, por ejemplo, el script de Gentoo run-crons utiliza un archivo de bloqueo que es un enlace simbólico que apunta al PID del proceso en ejecución. En el modo nativestrict , el script dejó de funcionar porque ya no podía crear el archivo de bloqueo. Nota: run-crons es un script de ayuda crontab en Gentoo Linux, que agrega soporte para cron.{hourly,daily,weekly,monthly}/ dirs, funciona muy bien con Cygwin.


Probablemente estabas buscando una manera de llegar a otro destino en el árbol de catálogo usando MSYS. Hay una manera. Debe crear un script de shell (archivo "* .sh") que contenga la línea:

cd "/drive_letter/SubCatalogue/SubFolder/..."


Ya que la respuesta de @olibre no me funcionó. Acabo de crear una función de shell.

: '' mklink - Create NTFS (Windows) links that is usable by Windows and Cygwin Usage: mklink [/D | /H | /J] <link-path> <target-path> Options: /D Directory Symbolic Link /H Hardlink /J Directory Junction (you should prefer /D) With no options, it creates a NTFS file symlink. '' mklink () { if [ "$#" -ge "3" ]; then cmd /c mklink "$1" "$(cygpath --windows --absolute "$2")" "$(cygpath --windows --absolute "$3")" else cmd /c mklink "$(cygpath --windows --absolute "$1")" "$(cygpath --windows --absolute "$2")" fi }

Tenga en cuenta que necesita permisos de administrador (para Cygwin) para ejecutar lo anterior sin problemas.

Tenga en cuenta que no sé si existe alguna diferencia entre la vinculación simbólica a una ruta absoluta y la vinculación simétrica a una ruta relativa utilizando el mklink de CMD. En Linux, esos 2 tienen comportamientos diferentes si alguna vez decide mover el enlace simbólico o mover el archivo de destino, o mover ambos.