自動化のためのシェルスクリプトを書いていると,いろんな操作でディレクトリ名を連結してパスを作った際に"path/to/../my/../../nice/directory" みたいな感じになってしまうことがある.これはちょっとカッコ悪いし不便なので,これを正規化する(単純には ".." を取り除く) 方法は無いかなぁと思っていた.
なぜ今まで気づかなかったのか不思議だが, http://stackoverflow.com/questions/284662/how-do-you-normalize-a-file-path-in-bash にまんまの答えがあったのでメモがてら紹介.きっと知っている人にとっては常識なのだろうなぁ.上記のページでは3つの解が紹介されているが,そのうち1つはCのプログラムをコンパイルする必要がある.ここでは残りの2つを紹介する.
1つめは, readlink コマンドを使う方法だ.これは,Ubuntu等のDebian系Linuxディストリビューションには標準でインストールされている.
$ mydir="path/to/../my../../nice/directory" $ echo `readlink -f ${mydir}`
前者のコマンドが存在しない環境の場合,非常に単純に,
$ mydir="path/to/../my../../nice/directory" $ echo `cd -P ${mydir}; pwd`
とする方法もある(-Pオプションを使えばソフトリンクも解決できる.@sacred_foxさんありがとうございました)
ただし,両者に共通の制限事項として,「ディレクトリが実際に存在する」必要がある.