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 dejunction
ojunction
. - 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 dejunction
ojunction
. - 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 cadenawinsymlinks
owinsymlinks: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
owinsymlinks: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 parawinsymlinks
owinsymlinks: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
owinsymlinks: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
ywinsymlinks: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ólicoswinsymlinks:native
, mientras que conwinsymlinks:nativestrict
la llamada al sistemasymlink(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.