web-dev-qa-db-ja.com

bashでのWindows PATHからposixパスへの変換

Windows dirパスを変換するにはどうすればよいですか(c:/libs/Qt-static)を正しい[〜#〜] posix [〜#〜] dir path(/c/libs/Qt-static)標準msys機能を使用して?およびその逆?

38

msysはわかりませんが、簡単なGoogle検索でsedユーティリティが含まれていることがわかりました。したがって、msysでの動作がネイティブLinuxでの動作と同じであると想定すると、次の方法で実行できます。

WindowsからPOSIXへ

すべてのバックスラッシュをスラッシュに置き換え、ドライブ文字の後の最初のコロンを削除し、最初にスラッシュを追加する必要があります。

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

または、xaizekが述べたように、

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

POSIXからWindowsへ

セミコロンを追加し、最初のスラッシュを削除して、すべてのスラッシュをバックスラッシュで置き換える必要があります。

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

より効率的に

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

どこ $pthは、WindowsまたはPOSIXパスをそれぞれ格納する変数です。

41
Rody Oldenhuis

Cygwinで使用していますか?はいの場合は、cygwinパッケージにcygpath.exeと呼ばれる既成のユーティリティがあります。

出力タイプオプション:
 -d、--dos DOS(ショート)形式の名前を出力します(C:\ PROGRA〜1 \)
 -m、--mixed like- -windows、ただし通常のスラッシュ(C:/ WINNT)
 -M、-modeファイルのモードに関するレポート(binmodeまたはtextmode)
 -u、--unix(デフォルト)print Unix NAMEの形式(/cygdrive/c/winnt)
 -w、--windows print Windows form of NAMEs(C:\ WINNT)
 -t、--type TYPE print TYPE form: ' dos」、「mixed」、「unix」、または「windows」
28
anishsane

これが私の実装です(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/に変換)はその中心であり、:2nd /の前に挿入します。読みやすさのために,ではなく/をdelimに使用します。 /\,^/,)で始まる場合は、/:/ndオカレンスの2に置き換えます。ドライブ文字の長さを1と想定したくないので、これは/sd0/some/dirで機能します。

s,^/,,は先頭の/を削除し、s,/,\\,gはすべての/\に変換します。

\,/$, !s,$,/,は、/cのコーナーケースを処理し、次のコマンドが機能するように2番目の//c/)を確保するためのものです。

注意:

ここで文字列<<<がシェルで機能しない場合は、echoとしてパイプして

echo "$@" | sed ...

正誤表

ここに eスクリプト

3
hIpPy

MSYSの「正しい」方法は次のとおりです。

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

これにより、スラッシュを手動で変換する必要がなくなります。単にパス変換を無効にします。

1
Pod