Преобразование пути Windows в posix path в bash



Как я могу преобразоватьWindows dir path (скажем c:/libs/Qt-static) в правильный POSIX dir path (/c/libs/Qt-static) с помощью стандартных msys функций? И наоборот?

749   3  

3 ответов:

Я не знаю msys, но быстрый поиск в google показал мне, что он включает в себя утилиту sed. Итак, предполагая, что он работает аналогично в msys, чем в родной Linux, вот один из способов, как это сделать:

Из Windows в POSIX

Вам придется заменить все обратные косые черты косыми чертами, удалить первое двоеточие после буквы диска и добавить косую черту в начале:

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

Или, как отмечает хайзек,

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

Из POSIX в Windows

Вам придется добавить a точку с запятой, удалить первую косую черту и заменить все косые черты обратными косыми чертами:

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

Или более эффективно,

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

Где $pth - переменная, хранящая путь Windows или POSIX соответственно.

Вы используете его на cygwin? Если да, то для этого в пакете cygwin есть готовая утилита под названием cygpath.exe.

Output type options:
  -d, --dos             print DOS (short) form of NAMEs (C:\PROGRA~1\)
  -m, --mixed           like --windows, but with regular slashes (C:/WINNT)
  -M, --mode            report on mode of file (binmode or textmode)
  -u, --unix            (default) print Unix form of NAMEs (/cygdrive/c/winnt)
  -w, --windows         print Windows form of NAMEs (C:\WINNT)
  -t, --type TYPE       print TYPE form: 'dos', 'mixed', 'unix', or 'windows'

Вот моя реализация (протестирована на git bash).

Из POSIX в Windows

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

Работает для:

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

кроме

/
<path with space>

Пояснение:

\,^/, s,/,:/,2 (преобразует /drive/dir/ в /drive:/dir/) является его сердцем и вставляет : перед 2 nd /. Я использую , для delim вместо / для удобства чтения. Если начать с / (\,^/,), затем замените / на :/ для 2 nd вхождения. Я не хочу предполагать, что длина буквы диска равна 1, поэтому это работает для /sd0/some/dir.

s,^/,, удаляет ведущий / и s,/,\\,g преобразует все / в \.

\,/$, !s,$,/, это для обработки углового случая /c и обеспечения 2-го / (/c/) чтобы сработала следующая команда.

Примечание:

Если здесь строка <<< не работает в вашей оболочке, то вы можете echo и трубить как

echo "$@" | sed ...

Errata

Здесь e script

Comments

    Ничего не найдено.