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?
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:
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/://'
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:/'
où $pth
est une variable stockant respectivement le chemin Windows ou POSIX.
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 '
Voici mon implémentation (testée sur git bash).
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 2
nd /
. J'utilise ,
pour délimiter au lieu de /
pour plus de lisibilité. Si vous commencez par /
(\,^/,
), puis remplacez /
avec :/
pour le 2
nd 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
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.