Schauen Sie sich realpath
an das unter GNU/Linux, FreeBSD und NetBSD verfügbar ist, aber nicht unter OpenBSD 6.8. Ich verwende so etwas wie:
CONTAININGDIR=$(realpath ${FILEPATH%/*})
um das zu tun, was sich anhört, als würdest du es versuchen.
Um den vollständigen Pfad zu erhalten, verwenden Sie:
readlink -f relative/path/to/file
So erhalten Sie das Verzeichnis einer Datei:
dirname relative/path/to/file
Sie können die beiden auch kombinieren:
dirname $(readlink -f relative/path/to/file)
Wenn readlink -f
auf Ihrem System nicht verfügbar ist, können Sie dies verwenden:
function myreadlink() {
(
cd "$(dirname $1)" # or cd "${1%/*}"
echo "$PWD/$(basename $1)" # or echo "$PWD/${1##*/}"
)
}
Beachten Sie, dass Sie, wenn Sie nur in ein Verzeichnis einer Datei wechseln müssen, die als relativer Pfad angegeben ist, den absoluten Pfad nicht kennen müssen, ein relativer Pfad ist vollkommen zulässig, also verwenden Sie einfach:
cd $(dirname relative/path/to/file)
Wenn Sie (während das Skript ausgeführt wird) zum ursprünglichen Pfad zurückkehren möchten, verwenden Sie pushd
statt cd
, und popd
wenn Sie fertig sind.
* Während myreadlink
oben ist im Kontext dieser Frage gut genug, es hat einige Einschränkungen in Bezug auf readlink
oben vorgeschlagenes Werkzeug. Beispielsweise folgt es einem Link zu einer Datei mit einem anderen basename
nicht korrekt .
Dies funktioniert sowohl für Dateien als auch für Ordner:
absPath(){
if [[ -d "$1" ]]; then
cd "$1"
echo "$(pwd -P)"
else
cd "$(dirname "$1")"
echo "$(pwd -P)/$(basename "$1")"
fi
}