web-dev-qa-db-fra.com

Conversion de chemin Windows PATH en posix dans bash

Comment puis-je convertir un chemin Windows dir (disons c:/libs/Qt-static) vers le bon chemin POSIX dir (/c/libs/Qt-static) au moyen de fonctionnalités standard msys? Et vice versa?

38
Tomilov Anatoliy

Je ne sais pas msys, mais une recherche rapide sur Google m'a montré qu'il comprend l'utilitaire sed. Donc, en supposant que cela fonctionne de manière similaire dans msys que sur Linux natif, voici une façon de procéder:

De Windows à POSIX

Vous devrez remplacer toutes les barres obliques inverses par des barres obliques, supprimer le premier deux-points après la lettre de lecteur et ajouter une barre oblique au début:

echo "/$pth" | sed 's/\\/\//g' | sed 's/://'

ou, comme l'a noté xaizek,

echo "/$pth" | sed -e 's/\\/\//g' -e 's/://'

De POSIX à Windows

Vous devrez ajouter un point-virgule, supprimer la première barre oblique et remplacer toutes les barres obliques par des barres obliques inverses:

echo "$pth" | sed 's/^\///' | sed 's/\//\\/g' | sed 's/^./\0:/'

ou plus efficacement,

echo "$pth" | sed -e 's/^\///' -e 's/\//\\/g' -e 's/^./\0:/'

$pth est une variable stockant respectivement le chemin Windows ou POSIX.

41
Rody Oldenhuis

L'utilisez-vous sur cygwin? Si oui, il existe un utilitaire prêt à l'emploi appelé cygpath.exe dans le package cygwin juste pour cela.

 Options de type de sortie: 
 -D, --dos affiche la forme DOS (courte) des NOMS (C:\PROGRA ~ 1 \) 
 -M, --mixed like - -windows, mais avec des barres obliques régulières (C:/WINNT) 
 -M, --mode rapport sur le mode de fichier (binmode ou textmode) 
 -u, --unix (par défaut) print Unix forme de NOMS (/cygdrive/c/winnt)
 -w, --windows imprimer la forme Windows de NOMS (C:\WINNT) 
 -t, --type TYPE print TYPE form forme: ' dos ',' mixed ',' unix 'ou' windows '
28
anishsane

Voici mon implémentation (testée sur git bash).

De POSIX à Windows

sed '
    \,/$, !s,$,/,
    \,^/, s,/,:/,2
    s,^/,,
    s,/,\\,g
    ' <<< "$@"

Fonctionne pour:

/c/git
relative/dir
c:/git
~
.
..
/c
/c/
./relative/dir
/sd0/some/dir/

sauf

/
<path with space>

Explication:

\,^/, s,/,:/,2 (convertit /drive/dir/ à /drive:/dir/) en est le cœur et insère : avant le 2nd /. J'utilise , pour délimiter au lieu de / pour plus de lisibilité. Si vous commencez par / (\,^/,), puis remplacez / avec :/ pour le 2nd occurrence. Je ne veux pas supposer une longueur de lettre de lecteur de 1, donc cela fonctionne pour /sd0/some/dir.

s,^/,, supprime le premier / et s,/,\\,g convertit tout / à \.

\,/$, !s,$,/, consiste à gérer le cas d'angle de /c et assurer le 2e / (/c/) pour que la prochaine commande fonctionne.

Remarque:

Si ici chaîne <<< ne fonctionne pas dans votre Shell, alors vous pouvez echo et pipe comme

echo "$@" | sed ...

Errata

Ici e script

3
hIpPy

La manière "correcte" dans MSYS est:

$ MSYS_NO_PATHCONV=1  taskkill /F /T /IM ssh-agent.exe

Cela évite d'avoir à traduire manuellement les barres obliques. Il désactive simplement la conversion du chemin.

1
Pod