realpath
を見てください これは GNU/Linux、FreeBSD、および NetBSD で利用できますが、OpenBSD 6.8 では利用できません。私は次のようなものを使用します:
CONTAININGDIR=$(realpath ${FILEPATH%/*})
あなたがやろうとしているように聞こえることをするために。
フルパスを取得するには:
readlink -f relative/path/to/file
ファイルのディレクトリを取得するには:
dirname relative/path/to/file
2 つを組み合わせることもできます:
dirname $(readlink -f relative/path/to/file)
readlink -f
の場合 お使いのシステムでは利用できません。これを使用できます:
function myreadlink() {
(
cd "$(dirname $1)" # or cd "${1%/*}"
echo "$PWD/$(basename $1)" # or echo "$PWD/${1##*/}"
)
}
相対パスとして指定されたファイルのディレクトリに移動するだけでよい場合は、絶対パスを知る必要はありません。相対パスは完全に合法であるため、以下を使用してください:
cd $(dirname relative/path/to/file)
(スクリプトの実行中に) 元のパスに戻りたい場合は、pushd
を使用します。 cd
の代わりに 、および popd
* myreadlink
の間 この質問の文脈では上記で十分ですが、 readlink
に比べていくつかの制限があります 上記で提案されたツール。たとえば、 basename
が異なるファイルへのリンクを正しくたどらない .
これは、ファイルとフォルダーの両方で機能します:
absPath(){
if [[ -d "$1" ]]; then
cd "$1"
echo "$(pwd -P)"
else
cd "$(dirname "$1")"
echo "$(pwd -P)/$(basename "$1")"
fi
}