Echa un vistazo a realpath
que está disponible en GNU/Linux, FreeBSD y NetBSD, pero no en OpenBSD 6.8. Yo uso algo como:
CONTAININGDIR=$(realpath ${FILEPATH%/*})
para hacer lo que parece que estás tratando de hacer.
Para obtener la ruta completa, use:
readlink -f relative/path/to/file
Para obtener el directorio de un archivo:
dirname relative/path/to/file
También puedes combinar los dos:
dirname $(readlink -f relative/path/to/file)
Si readlink -f
no está disponible en su sistema, puede usar esto:
function myreadlink() {
(
cd "$(dirname $1)" # or cd "${1%/*}"
echo "$PWD/$(basename $1)" # or echo "$PWD/${1##*/}"
)
}
Tenga en cuenta que si solo necesita moverse a un directorio de un archivo especificado como una ruta relativa, no necesita conocer la ruta absoluta, una ruta relativa es perfectamente legal, así que solo use:
cd $(dirname relative/path/to/file)
si desea volver (mientras se ejecuta el script) a la ruta original, use pushd
en lugar de cd
y popd
cuando termines.
* Mientras que myreadlink
anterior es lo suficientemente bueno en el contexto de esta pregunta, tiene alguna limitación relativa al readlink
herramienta sugerida anteriormente. Por ejemplo, no sigue correctamente un enlace a un archivo con diferente basename
.
Esto funcionará tanto para el archivo como para la carpeta:
absPath(){
if [[ -d "$1" ]]; then
cd "$1"
echo "$(pwd -P)"
else
cd "$(dirname "$1")"
echo "$(pwd -P)/$(basename "$1")"
fi
}