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
}