Windows GitBash でパスを Windows 形式と Linux 形式とで相互変換する

Linux 形式というか、POSIX パスってヤツかね。

Windows GitBash では混在しがちな、これら2種類のパス表記を相互変換してみる。

なお、Windows 形式のパスをシングルクォートで囲めば、形式を変換しなくとも cd したりはできるのだが、今回はワケあって変換後のパスが欲しいというテイで。

# GitBash では Windows 形式のパスでも移動したりできる
$ cd 'C:\hoge hoge\fuga\'

$ pwd
/c/hoge hoge /fuga

Windows 形式 → Linux 形式への変換

Linux 形式へと変換するには次のとおり。

$ echo 'C:\hoge hoge\fuga\example.txt' | sed 's@^\([a-zA-Z]\):@/\L\1@' | sed 's@\\@/@g'

/c/hoge hoge/fuga/example.txt

1つ目の sed でドライブレター部分 C:/c と変換している。

\L\1 と書くと英語を小文字に変換できる。もし \U\1 と書けば、今度は大文字に変換できる。

2つ目の sed は、以降に登場するバックスラッシュをスラッシュに変換しているだけ。

Linux 形式 → Windows 形式への変換

逆パターンは次のとおり。

$ echo '/c/hoge hoge/fuga/example.txt' | sed 's@^/\([a-zA-z]\)@\U\1:@' | sed 's@/@\\@g'

C:\hoge hoge\fuga\example.txt

コチラも同じ要領。1つ目の sed でドライブレター /c 部分を特定して \U\1 で大文字化しつつ C: と変換。2つ目の sed でスラッシュをバックスラッシュにしているだけ。

関数化しておく

function win_to_posix() { echo "$1" | sed 's@^\([a-zA-Z]\):@/\L\1@' | sed 's@\\@/@g' ; }
function posix_to_win() { echo "$1" | sed 's@^/\([a-zA-z]\)@\U\1:@' | sed 's@/@\\@g' ; }

$ win_to_posix 'C:\hoge hoge\fuga\example.txt'
$ posix_to_win '/c/hoge hoge/fuga/example.txt'

こんな感じ~。