パスの../..部分をプログラム的に圧縮する方法はありますか?

パスの../..部分をプログラム的に圧縮する方法はありますか?

たとえば、私のスクリプトには次の種類のファイルパスがあります。

/path/to/some/file/../../file1.txt

readlinkそのパスを実際の物理形式に変換するために呼び出すことができるコマンドはありますか?

/path/to/file1.txt

答え1

ああ、あまりにも急な質問ですね。 Linuxでは、スイッチreadlinkで使用するのが答えです-m

$ readlink -m /home/saml/web/../web_login_form_examples/basic-php-parsing.zip
/home/saml/web_login_form_examples/basic-php-parsing.zip

読み取りリンクのマニュアルページ

-m, --canonicalize-missing
       canonicalize by following every symlink in every component of the
       given name recursively, without requirements on components existence

答え2

シンボリックリンクに興味がなく、file.txtファイルが存在すると仮定する場合:

filename=/path/to/file1.txt
canonical_directory=$(cd -- "$(dirname -- "$filename")/" && pwd -P)
echo "$canonical_directory/${filename##*/}"

これは完全に移植可能です(一部のPOSIX以前の好奇心を除いて)。

関連情報