Abilita i collegamenti simbolici nativi NTFS per Cygwin

Recenti NTFS e Windows implementano i collegamenti simbolici:

  • Il punto di giunzione NTFS può essere utilizzato come link simbolico di directory da NTFS 3.0 (Windows 2000) utilizzando strumenti di junction o junction .
  • Il collegamento simbolico NTFS può anche essere utilizzato come collegamento simbolico (per file e directory) da Windows Vista utilizzando mklink strumento mklink .

Ma su Cygwin 1.7 (installato su Windows 7), ln -s crea un file di testo.

su Cygwin:

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

su MinGW (o il tuo editor preferito):

 $ cat mylink !ÿþt arget 

È ansible dire a Cygwing di utilizzare il punto di giunzione NTFS o il collegamento simbolico NTFS ?

altra domanda: è disponibile su MinGW?

⸻⸻⸻ Risposta breve ⸻⸻⸻

Definisci la variabile di ambiente:

 CYGWIN=winsymlinks:nativestrict 

Come sottolineato da mwm potresti anche dover eseguire bash come amministratore.

⸻⸻⸻ Risposta lunga ⸻⸻⸻

I link simbolici Cygwin predefiniti sono solo file regolari

Per impostazione predefinita, Cygwin crea file di testo come soluzione alternativa per difetto symlink di Windows. Questi file non sono realmente collegamenti simbolici . Quasi tutti i programmi Windows non considerano questi file come collegamenti simbolici.

I collegamenti simbolici nativi sono disponibili nelle versioni di Windows recenti

Recenti NTFS e Windows implementano i collegamenti simbolici:

  • Il punto di giunzione NTFS può essere utilizzato come link simbolico di directory da NTFS 3.0 (Windows 2000) utilizzando strumenti di junction o junction .
  • Il collegamento simbolico NTFS può anche essere utilizzato come collegamento simbolico (per file e directory) da Windows Vista utilizzando mklink strumento mklink .

Cygwin può creare collegamenti simbolici nativi NTFS

Estratto semplificato della documentazione Cygwin :

Collegamenti simbolici

[…]

Cygwin crea collegamenti simbolici potenzialmente in diversi modi:

  • I collegamenti simbolici predefiniti sono semplici file contenenti un cookie magico seguito dal percorso a cui punta il collegamento. […]

  • I collegamenti simbolici di stile di scelta rapida sono Windows .lnk […] creato se la variabile di ambiente CYGWIN […] è impostata per contenere la stringa winsymlinks o winsymlinks:lnk . […]

  • I collegamenti simbolici nativi di Windows vengono creati solo su Windows Vista / 2008 e versioni successive e solo su file system che supportano i reparse point. A causa delle loro strane restrizioni e comportamenti, vengono creati solo se l’utente richiede esplicitamente di crearli. Questo viene fatto impostando la variabile di ambiente CYGWIN per contenere la stringa winsymlinks:native o winsymlinks:nativestrict . […]

  • Sul filesystem NFS, Cygwin crea sempre dei veri e propri symlink NFS.

Configurazione di Cygwin

Cygwin User’s Guide presenta CYGWIN variabile e winsymlinks opzione:

La variabile di ambiente CYGWIN viene utilizzata per configurare molte impostazioni globali […]. Contiene le opzioni elencate di seguito, separate da caratteri vuoti. […]

  • […]
  • […]
  • […]
  • […]
  • winsymlinks:{lnk,native,nativestrict} – se impostato su solo winsymlinks o winsymlinks:lnk , Cygwin crea collegamenti simbolici come scorciatoie di Windows con un’intestazione speciale e il set di attributi R / O.

    Se impostato su winsymlinks:native o winsymlinks:nativestrict , Cygwin crea winsymlinks:nativestrict simbolici come winsymlinks:nativestrict simbolici nativi di Windows su file system e versioni del sistema operativo che li supportano. Se il sistema operativo è noto per non supportare i collegamenti simbolici nativi (Windows XP, Windows Server 2003), viene prodotto un messaggio di avviso una volta per sessione.

    La differenza tra winsymlinks:native e winsymlinks:nativestrict è questa: se il filesystem supporta i symlink nativi e Cygwin non riesce a creare un symlink nativo per qualche motivo, ricadrà alla creazione di winsymlinks:native simbolici predefiniti di Cygwin con winsymlinks:native , mentre con winsymlinks:nativestrict la chiamata di sistema symlink(2) fallirà immediatamente.

CYGWIN=winsymlinks:native
crea sempre un collegamento ma usa un fallback Cygwin quando l’objective non esiste

su Cygwin:

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

su MinGW:

 $ cat mylink content 

Le persone che utilizzano entrambi i programmi Windows e Cygwin possono avere problemi quando un collegamento simbolico viene creato come un file fittizio (fallback Cygwin quando manca l’objective) …

CYGWIN=winsymlinks:nativestrict
usa sempre symlink nativo di Windows ma fallisce quando la destinazione non esiste

su Cygwin:

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

Poiché nativestrict richiede che la destinazione esista prima della creazione del collegamento simbolico, alcuni comandi / script potrebbero non riuscire durante la creazione di un collegamento.

Nota: solo gli amministratori hanno la possibilità di creare collegamenti simbolici NT nativi, quindi in UAC di Windows, l’emulatore di terminale Cygwin (mintty) deve essere eseguito con privilegi elevati (fare clic con il tasto destro del mouse sul collegamento e scegliere Esegui come amministratore o impostare la proprietà scorciatoie mintty, Avanzate → Esegui come amministratore ).

Un ringraziamento speciale a Guria e Spooky per il loro contributo.

La risposta accettata è giusta, due piccole note a margine.

Se ti interessa solo i link simbolici che crei tu stesso sulla riga di comando, installa cygutils-extra pacchetto cygutils-extra , include un comando winln , che ha la stessa syntax di ln , ma crea collegamenti nativi a Windows. Crea un alias: alias ln=winln (funziona solo nella shell intertriggers), o addirittura sostituisce il file ln con winln (funziona anche negli script di shell) – ma potrebbe essere sovrascritto al successivo coreutils pacchetto coreutils .

Ho appena scoperto che è ansible utilizzare i collegamenti simbolici nativi quando ho già installato Cygwin e ho aggiunto anche alcuni collegamenti simbolici. Quindi, dopo aver impostato CYGWIN=winsymlinks:native come variabile di ambiente del mio sistema, volevo convertire tutti i link non nativi esistenti in nativi. Ecco cosa ho fatto.

Per sicurezza, fai prima il backup dell’intera directory di Cygwin.

Trova tutti i /links simbolici e salva l’elenco in /links file: 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

Controlla i links . Crea un archivio tar con tutti i link: tar c --files-from=links >links.tar

Estrai l’archivio tar : tar x --files-from=links Poiché i symlinks nativi sono ora abilitati, tar sovrascriverà i tar x --files-from=links simbolici del vecchio Cygwin con tar x --files-from=links simbolici nativi.

Pulisci: rm -f links links.tar

PS All'inizio ho usato CYGWIN=winsymlinks:nativestrict , ma poi ho scoperto che in questa modalità, il ln -s target link fallisce se la target non esiste. Al contrario, native creerà un link simbolico Cygwin (non nativo) link punta alla target inesistente - questo corrisponde al comportamento di ln sui sistemi UNIX. In rari casi, nativestrict può interrompere alcuni programmi o script, ad esempio lo script Gentoo run-crons utilizza un lockfile che è un collegamento simbolico che punta al PID del processo in esecuzione. In modalità nativestrict lo script ha smesso di funzionare, perché non è più ansible creare il file di lock. Nota: run-crons è uno script helper crontab su Gentoo Linux, aggiungendo il supporto per cron.{hourly,daily,weekly,monthly}/ dirs, funziona molto bene con Cygwin.

Dal momento che la risposta @olibre non ha funzionato per me. Ho appena creato una funzione shell.

 : ' mklink - Create NTFS (Windows) links that is usable by Windows and Cygwin Usage: mklink [/D | /H | /J]   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 } 

Si noti che è necessario disporre delle autorizzazioni di amministratore (per Cygwin) per eseguire quanto sopra senza problemi.

Si noti che non sono a conoscenza dell’esistenza di alcuna differenza tra il collegamento simbolico a un percorso assoluto rispetto al collegamento simbolico a un percorso relativo che utilizza mklink . Su Linux, questi 2 hanno comportamenti diversi se decidete di spostare il collegamento simbolico o spostare il file di destinazione, o spostarli entrambi.

Probabilmente stai cercando un modo per raggiungere un’altra destinazione nella struttura del catalogo usando MSYS. C’è un modo. Dovresti creare uno script di shell (“* .sh” file) che contenga la riga:

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