NTFS et Windows récents implémentent des liens symboliques:
linkd
ou junction
.mklink
.Mais sur Cygwin 1.7 (installé sur Windows 7), ln -s
crée un fichier texte.
sur Cygwin:
$ ln -s -v target mylink
`mylink' -> `target'
sur MinGW (ou votre éditeur préféré):
$ cat mylink
!<symlink>ÿþt a r g e t
Est-il possible de dire à Cygwing d'utiliser le point de jonction NTFS ou le lien symbolique NTFS ?
autre question: Est-ce disponible sur MinGW?
Définir la variable d'environnement:
CYGWIN=winsymlinks:nativestrict
Comme indiqué par mwm , vous devrez peut-être également exécuter bash en tant qu’administrateur.
Par défaut, Cygwin crée des fichiers texte comme solution de contournement pour la faille de lien symbolique Windows . Ces fichiers ne sont pas vraiment liens symboliques . La plupart des programmes Windows ne les considèrent pas comme des liens symboliques.
NTFS et Windows récents implémentent des liens symboliques:
linkd
ou junction
.mklink
.Extrait simplifié de la documentation Cygwin :
Liens symboliques
[...]
Cygwin crée potentiellement des liens symboliques de plusieurs manières différentes:
Les liens symboliques par défaut sont des fichiers simples contenant un cookie magique suivi du chemin sur lequel pointe le lien. [...]
Les liens symboliques de style de raccourci sont créés par Windows
.lnk
[...] si la variable d'environnement CYGWIN [...] est définie pour contenir la chaînewinsymlinks
ouwinsymlinks:lnk
. [...]Les liens symboliques Windows natifs ne sont créés que sous Windows Vista/2008 et les versions ultérieures, et uniquement sur les systèmes de fichiers prenant en charge les points d'analyse. En raison de leurs restrictions et de leur comportement étranges, ils ne sont créés que si l'utilisateur demande explicitement de les créer. Ceci est fait en définissant la variable d'environnement CYGWIN contenir la chaîne
winsymlinks:native
ouwinsymlinks:nativestrict
. [...]Sur le système de fichiers NFS, Cygwin crée toujours de véritables liens symboliques NFS.
Guide de l'utilisateur Cygwin présente la variable CYGWIN
et l'option winsymlinks
:
La variable d'environnement
CYGWIN
permet de configurer de nombreux paramètres globaux [...] . Il contient les options énumérées ci-dessous, séparées par des caractères vides. [...]
- [...]
- [...]
- [...]
- [...]
winsymlinks:{lnk,native,nativestrict}
- si elle est définie uniquement surwinsymlinks
ouwinsymlinks:lnk
, Cygwin crée des liens symboliques en tant que raccourcis Windows avec un en-tête spécial et l'ensemble d'attributs R/O.Si défini sur
winsymlinks:native
ouwinsymlinks:nativestrict
, Cygwin crée des liens symboliques sous forme de liens symboliques Windows natifs sur des systèmes de fichiers et les versions d'OS les supportant. Si on sait que le système d'exploitation ne prend pas en charge Liens symboliques natifs (Windows XP, Windows Server 2003), un message d'avertissement est produit une fois par session.La différence entre
winsymlinks:native
etwinsymlinks:nativestrict
est ceci: Si le système de fichiers prend en charge natif Liens symboliques et Cygwin ne parvient pas à créer un lien symbolique natif pour une raison quelconque, il faudra revenir à la création de liens symboliques par défaut avec Cygwin avecwinsymlinks:native
, alors que avecwinsymlinks:nativestrict
l'appel systèmesymlink(2)
échouera immédiatement.
CYGWIN=winsymlinks:native
sur Cygwin:
$ export CYGWIN="winsymlinks:native"
$ ln -s -v target mylink
`mylink' -> `target'
$ echo content > target
sur MinGW:
$ cat mylink
content
Les personnes utilisant à la fois Windows et les programmes Cygwin peuvent avoir des problèmes lorsqu'un lien symbolique est créé en tant que fichier factice (remplacement de Cygwin lorsque la cible est manquante) ...
CYGWIN=winsymlinks:nativestrict
sur 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'
Étant donné que nativestrict
requiert que la cible existe avant la création du lien symbolique, certaines commandes/scripts peuvent échouer lors de la création d'un lien.
Remarque: Seuls les administrateurs ont la possibilité de créer des liens symboliques NT natifsSo sous Windows UAC, l'émulateur de terminal Cygwin (mintty) Doit être exécuté avec des privilèges élevés (Cliquez avec le bouton droit sur le raccourci et choisissez Exécuter en tant qu'administrateur ou définissez la propriété de raccourci menthe, Avancé → Exécuter en tant qu'administrateur).
Un merci spécial à Guria et Spooky pour leurs contributions.
La réponse acceptée est la bonne, deux petites notes.
Si vous ne vous souciez que des liens symboliques que vous créez vous-même sur la ligne de commande, installez le package cygutils-extra
, qui inclut une commande winln
, qui a la même syntaxe que ln
, mais crée des liens Windows natifs. Créez un alias: alias ln=winln
(ne fonctionne que dans le shell interactif), ou remplacez même le fichier ln
par winln
(fonctionne également dans les scripts du shell) - mais il pourrait être écrasé à la prochaine mise à jour du paquet coreutils
.
J'ai seulement découvert qu'il était possible d'utiliser des liens symboliques natifs alors que j'avais déjà installé Cygwin, et que j'avais également ajouté quelques liens symboliques. Ainsi, après avoir défini CYGWIN=winsymlinks:native
comme variable d’environnement système, je souhaitais convertir tous les liens non natifs existants en natifs. Voici ce que j'ai fait.
Juste au cas où, sauvegardez d'abord tout votre répertoire Cygwin.
Recherchez tous les liens symboliques et enregistrez la liste dans le fichier /links
: cd /; find . -regextype egrep -regex './(dev|proc|mnt|cygdrive)' -Prune -o -type l -print >links
Passez en revue links
. Créez une archive tar
avec tous les liens: tar c --files-from=links >links.tar
Extrayez l'archive tar
: tar x --files-from=links <links.tar
Comme les liens symboliques natifs sont maintenant activés, tar remplacera les liens symboliques de l'ancien Cygwin par des liens symboliques natifs.
Nettoyer: rm -f links links.tar
P.S. Au début, j'ai utilisé CYGWIN=winsymlinks:nativestrict
, mais j'ai découvert que dans ce mode, ln -s target link
échoue si target
n'existe pas. En revanche, native
créera un lien symbolique Cygwin (non natif) link
pointant vers la variable target
non existante - ceci correspond au comportement de ln
sur les systèmes UNIX. Dans de rares cas, nativestrict
peut interrompre certains programmes ou scripts, par exemple, le script Gentoo run-crons
utilise un fichier de verrouillage qui est un lien symbolique pointant vers le PID du processus en cours d'exécution. En mode nativestrict
, le script a cessé de fonctionner car il ne pouvait plus créer le fichier de verrouillage. Remarque: run-crons
est un script d’aide crontab sous Gentoo Linux, qui prend en charge les répertoires cron.{hourly,daily,weekly,monthly}/
et fonctionne très bien avec Cygwin.
Depuis @olibre answer n'a pas fonctionné pour moi. Je viens de créer une fonction 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
}
Notez que vous avez besoin d'autorisations d'administrateur (pour Cygwin) pour exécuter ce qui précède sans problèmes.
Notez que je ne sais pas s’il existe une différence entre une liaison symbolique vers un chemin absolu et une liaison symbolique vers un chemin relatif utilisant la variable mklink
de CMD. Sous Linux, ces deux comportements ont des comportements différents si vous décidez de déplacer le lien symbolique ou de déplacer le fichier cible, ou de déplacer les deux.
Je suppose que le moyen le plus simple est de
grant SeCreateSymbolicLinkPrivilege à partir de l'éditeur de stratégie de groupe locale (gpedit.msc, sur le chemin par défaut, versions non domestiques)
créer un script nommé ln
sur le chemin (batch ou bash), implémentation semblable à la fonction Shell décrite ci-dessus
profit