cygwinでフルパス

症状

ファイルのfullpathが欲しい時に、よくやるのが「cd、pwd、basename・・・」というスクリプトで書くらしいけど、ちょっと面倒。

対策

「readlink.exe」を使う。これだけ。「canonical path*1」で調べて見つけました。ファイルが存在しなくてもフルパス(絶対パス)を与えてくれます。
存在しないファイル「missing.txt」の絶対パスを知るには「-f」オプションが要ります。

etc@etcpc /cygdrive/d/some
$ readlink -f missing.txt   # -f
/cygdrive/d/some/missing.txt

etc@etcpc /cygdrive/d/some
$ readlink -fn missing.txt      # -n は改行無し
/cygdrive/d/some/missing.txt
etc@etcpc /cygdrive/d/some
$ echo $?
0

etc@etcpc /cygdrive/d/some
$ readlink -en missing.txt      # -eはファイルが存在しないとNULLが返る

etc@etcpc /cygdrive/d/some
$ echo $?
1

etc@etcpc /cygdrive/d/some
$ readlink -e -n -v missing.txt # -vでエラーメッセージ
readlink: missing.txt: No such file or directory

etc@etcpc /cygdrive/d/some
$ readlink -f ../missing.txt    
/cygdrive/d/missing.txt        #相対パスを問答無用で解釈してくれる 

etc@etcpc /cygdrive/d/some
$ readlink -f ../../../../../../../missing.txt
/missing.txt                    #相対パスを御意見無用で解釈してくれる


リンクファイルだと、大元まで追いかけます。使い方によって、引数を選択する必要がありそうです。

もちろん、次の使い方もあり。

$ cygpath -w `readlink -f -n missing.txt`
D:\some\missing.txt

*1:正準?正規?