Activer les liens symboliques NTFS natifs pour Cygwin
NTFS récents et Windows implémentent des liens symboliques:
-
le point de jonction NTFS peut être utilisé comme lien symbolique de répertoire depuis NTFS 3.0 (Windows 2000) à l'aide des outils
linkd
oujunction
. -
NTFS lien symbolique peut également être utilisé comme lien symbolique (pour le fichier et le répertoire) depuis Windows Vista en utilisant l'outil
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 favori éditeur):
$ cat mylink
!<symlink>ÿþt a r g e t
Est-il possible de dire Cygwing utiliser point de jonction NTFS ou NTFS lien symbolique?
Autre question: Est-ce disponible sur MinGW?
4 réponses
Réponse Courte
Définir la variable d'environnement:
CYGWIN=winsymlinks:nativestrict
, Comme l'a souligné mwm vous pouvez également exécuter bash en tant qu'Administrateur.
Réponse Longue
Les liens symboliques Cygwin par défaut ne sont que des fichiers réguliers
Par défaut Cygwin crée des fichiers texte comme solution de contournement pour Windows lien symbolique faille. Ces fichiers ne sont pas vraiment liens symboliques. Presque tous les programmes Windows ne considère pas ces fichiers comme symbolique.
Les liens symboliques natifs sont disponibles sur les versions récentes de Windows
NTFS récents et Windows implémentent des liens symboliques:
-
le point de jonction NTFS peut être utilisé comme lien symbolique de répertoire
depuis NTFS 3.0 (Windows 2000) en utilisant les outils
linkd
oujunction
. -
NTFS lien symbolique peut également être utilisé comme lien symbolique
(pour le fichier et le répertoire) depuis Windows Vista en utilisant l'outil
mklink
.
Cygwin peut créer natif NTFS liens symboliques
Extrait simplifié de la documentation Cygwin :
Liens Symboliques
[...]
Cygwin crée des liens symboliques potentiellement de plusieurs façons différentes:
Les liens symboliques par défaut sont des fichiers simples contenant un cookie magique suivi par le chemin vers lequel le lien pointe. [...]
Les liens symboliques de style raccourci sont Windows
.lnk
[...] créé si l'environnement variable CYGWIN [...] est configuré pour contenir la chaînewinsymlinks
ouwinsymlinks:lnk
. [...]Les liens symboliques Windows natifs ne sont créés que sur Windows Vista / 2008 et versions ultérieures, et uniquement sur les systèmes de fichiers prenant en charge les points d'analyse. En raison de leurs restrictions étranges et le comportement, ils ne sont créés si l'utilisateur demande explicitement de les créer. Ceci est fait en définissant la variable D'environnement CYGWIN pour contenir la chaîne
winsymlinks:native
ouwinsymlinks:nativestrict
. [...]Sur le Système de fichiers NFS, Cygwin crée toujours de vrais liens symboliques NFS.
Configuration De Cygwin
Le Guide de L'utilisateur de Cygwin présente la variable CYGWIN
et l'option winsymlinks
:
La variable d'environnement
CYGWIN
est utilisée pour 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 la valeur est justewinsymlinks
ouwinsymlinks:lnk
, Cygwin crée des liens symboliques comme raccourcis Windows avec un en-tête spécialet l'ensemble d'attributs R / O.Si défini sur
winsymlinks:native
ouwinsymlinks:nativestrict
, Cygwin crée des liens symboliques en tant que liens symboliques Windows natifs sur les systèmes de fichiers et les versions OS les supportant. Si le système d'exploitation est connu pour ne pas soutenir liens symboliques natifs (Windows XP, Windows Server 2003), un message d'avertissement est produit Une fois par session.La différence entre
winsymlinks:native
et {[11] } est-ce: si le système de fichiers prend en charge les les liens symboliques et Cygwin ne parviennent pas à créer un lien symbolique natif pour une raison quelconque, il reviendra à la création de liens symboliques par défaut Cygwin avecwinsymlinks:native
, alors qu'avecwinsymlinks:nativestrict
l'appel systèmesymlink(2)
échouera immédiatement.
CYGWIN=winsymlinks:native
crée toujours un lien mais utilise un repli Cygwin lorsque la cible n'existe pas
Sur Cygwin:
$ export CYGWIN="winsymlinks:native"
$ ln -s -v target mylink
`mylink' -> `target'
$ echo content > target
Sur MinGW:
$ cat mylink
content
Les personnes utilisant les programmes Windows et Cygwin peuvent avoir problèmes lorsqu'un lien symbolique est créé en tant que fichier fictif (repli Cygwin lorsque la cible est manquante)...
CYGWIN=winsymlinks:nativestrict
utilise toujours le lien symbolique Windows natif mais échoue lorsque la cible n'existe pas
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'
Parce que nativestrict
nécessite 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 natifs donc 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é mintty shortcut, avancé → exécuter en tant Qu'administrateur).
un merci Spécial à Guria et Spooky, pour leurs contributions.
La réponse acceptée est juste, deux petites notes de côté.
Si vous ne vous souciez que des liens symboliques que vous créez vous-même sur la ligne de commande, installez le paquet cygutils-extra
, Il 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
(fonctionne uniquement dans le shell interactif), ou même remplacez le fichier ln
par winln
(fonctionne également dans les scripts shell) - mais il pourrait être écrasé la prochaine fois que le paquet coreutils
est mis à jour.
J'ai seulement découvert qu'il est possible d'utiliser des liens symboliques natifs quand J'ai déjà installé Cygwin, et ajouté des liens symboliques par moi-même. Donc, après avoir défini CYGWIN=winsymlinks:native
comme variable d'environnement système, je voulais convertir tous les liens non natifs existants en natif. Voici ce que j'ai fait.
Juste au cas où, sauvegardez tout votre répertoire Cygwin en premier.
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
Examen links
.
Créer une archive tar
avec tous les liens: tar c --files-from=links >links.tar
Extraire l'archive tar
: tar x --files-from=links <links.tar
Puisque les liens symboliques natifs sont maintenant activés, tar écrasera les anciens liens symboliques de Cygwin avec des liens symboliques natifs.
Nettoyer: rm -f links links.tar
P. S. Au début, j'ai utilisé CYGWIN=winsymlinks:nativestrict
, mais ensuite, j'ai trouvé 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 l'inexistant target
- cela correspond au comportement de ln
sur les systèmes UNIX. Dans de rares cas, nativestrict
peut casser certains programmes ou scripts, par exemple Gentoo run-crons
script utilise un fichier de verrouillage qui est un lien symbolique pointant vers le PID du processus en cours. En mode nativestrict
, le script a cessé de fonctionner, car il ne pouvait plus créer le fichier de verrouillage. Note: run-crons
est un script d'aide crontab sur Gentoo Linux, ajoutant le support pour cron.{hourly,daily,weekly,monthly}/
dirs, il fonctionne très bien avec Cygwin.
Puisque la réponse @ olibre 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 des autorisations d'administrateur (pour Cygwin) pour exécuter ce qui précède sans problèmes.
Notez que je ne sais pas s'il y a une différence entre le lien symbolique vers un chemin absolu et le lien symbolique vers un chemin relatif en utilisant mklink
de CMD. Sous Linux, ces 2 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.
Vous cherchiez probablement un moyen d'arriver à une autre destination dans l'arborescence du catalogue en utilisant MSYS. Il y a un moyen. Vous devez créer un script shell (fichier"*. sh") qui contient line:
cd "/drive_letter/SubCatalogue/SubFolder/..."