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 ou junction.
  • 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?

39
demandé sur Anthony Geoghegan 2013-09-06 13:14:53

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 ou junction.
  • 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îne winsymlinks ou winsymlinks: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 ou winsymlinks: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 juste winsymlinks ou winsymlinks: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 ou winsymlinks: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 avec winsymlinks:native, alors qu'avec winsymlinks:nativestrict l'appel système symlink(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.

65
répondu olibre 2018-06-12 14:45:07

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.

6
répondu Gene Pavlovsky 2016-04-28 19:59:54

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.

2
répondu CMCDragonkai 2016-04-24 10:15:07

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/..." 
-5
répondu FreeCodeRide 2014-04-12 20:16:25