本当は怖いHPC

HPC屋の趣味&実益ブログ

シェルスクリプトで ".." とかを含んだパスを正規化する方法

自動化のためのシェルスクリプトを書いていると,いろんな操作でディレクトリ名を連結してパスを作った際に"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等のDebianLinuxディストリビューションには標準でインストールされている.

$ mydir="path/to/../my../../nice/directory"
$ echo `readlink -f ${mydir}`

前者のコマンドが存在しない環境の場合,非常に単純に,

$ mydir="path/to/../my../../nice/directory"
$ echo `cd -P ${mydir}; pwd`

とする方法もある(-Pオプションを使えばソフトリンクも解決できる.@sacred_foxさんありがとうございました)

ただし,両者に共通の制限事項として,「ディレクトリが実際に存在する」必要がある.

【広告】