¿Existe un comando Unix para obtener la ruta absoluta (y canonicalizada) de una ruta relativa que puede contener enlaces simbólicos?
63
Puede usar la readlink
utilidad, con la -f
opción:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
Algunas distribuciones, por ejemplo aquellas que usan GNU coreutils y FreeBSD , también vienen con una realpath(1)
utilidad que básicamente solo llama realpath(3)
y hace casi lo mismo.
-f
interruptor no existe en Mac OS X (al menos a partir de 10.8.5). Sin el-f
interruptor, solo devuelve un código de error.readlink
, nirealpath
- Solaris y HP-UX, en particular.brew install coreutils
apple.stackexchange.com/a/69332/23040 , y si no desea realizar el paso que redirige todas las herramientas CLI estándar de Mac a los equivalentes GNU recién instalados, simplemente llamegreadlink
.Portablemente, el shell establece la
PWD
variable en una ubicación absoluta del directorio actual. Cualquier componente de esa ruta puede ser un enlace simbólico.Si desea eliminar
.
y..
también, cambie al directorio que contiene el archivo y obtenga$PWD
allí:No hay una forma portátil de seguir enlaces simbólicos. Si tiene una ruta a un directorio, en la mayoría de los dispositivos
$(cd -- "$dir" && pwd -P 2>/dev/null || pwd)
proporciona una ruta que no usa enlaces simbólicos, porque los shells que rastrean enlaces simbólicos tienden a implementarsepwd -P
("P" para "físico").Algunas unidades proporcionan una utilidad para imprimir la ruta "física" a un archivo.
readlink -f
, al igual que FreeBSD ≥8.3, NetBSD ≥4.0 y OpenBSD desde 2.2.realpath
(también está presente en algunos sistemas Linux, y está en BusyBox).Si Perl está disponible, puede usar el
Cwd
módulo .fuente
pwd
($(cd -- "$dir" && pwd -P 2>/dev/null | pwd)
)? No parece importarle el stdin.||
¿Es
pwd
adecuado para sus necesidades? Da la ruta absoluta del directorio actual. O tal vez lo que quieres es realpath () .fuente
alister
yrss67
en este artículo presentamos la forma más estable, compatible y fácil. Nunca había visto una mejor manera que esta antes.Si desea volver a la ubicación original,
o
Deseo que esto ayude. Esta fue la mejor solución para mí.
fuente
ABSPATH=$(cd -- "$RELPATH" && pwd)
. Tenga en cuenta las comillas dobles alrededor de la sustitución (para no romper si la ruta contiene espacios en blanco y caracteres globales) y la--
(en caso de que la ruta comience con-
). Además, esto solo funciona para directorios, y no canonicaliza enlaces simbólicos según lo solicitado. Vea mi respuesta para más detalles.Las otras respuestas aquí estaban bien, pero eran insuficientes para mis necesidades. Necesitaba una solución que pudiera usar en mis scripts en cualquier máquina. Mi solución fue escribir un script de shell que pueda invocar desde los scripts donde lo necesito.
Esta solución está escrita para Bourne Shell para la portabilidad. Tengo esto en un script llamado "respath.sh".
Este script se puede usar así:
O así
El script resuelve la ruta en el primer argumento utilizando la ruta del segundo argumento como punto de partida. Si solo se proporciona el primer argumento, el script resuelve la ruta relativa a su directorio de trabajo actual.
fuente
pwd
incorporado y no es compatible-P
(el shell Bourne no implementó ese manejo lógico de $ PWD como lo hacen los shells POSIX).cd -P --
también en caso de que el primer argumento contenga algo ..case
cheque debe ser en..|../*)
lugar de..*
.dirname $cwd
En caso de que, además, tenga alguna ruta predefinida para
$1
(generalmente${PWD}
), lo siguiente funcionaría:fuente
Respetando la respuesta de todos los demás, encontré que la función a continuación es mucho más fácil y portátil entre Linux / MAC OSX que otras que encontré en todas partes. Podría ayudar a alguien.
fuente
Suponga que la variable a almacena un nombre de ruta (a = "lo que sea")
1. Para la ruta potencial que contiene espacio:
2. Para la pregunta real, es decir, convertir la ruta a absoluta: readlink puede recuperar el contenido del enlace simbólico, que puede emplearse de la siguiente manera. (la nota
readlink -f
habría sido perfecta, pero no está disponible al menos en Mac OS X bash, en el que -f significa FORMATOS ).3. Acabo de aprender
pwd -P
enman pwd
: -P es " Mostrar el directorio de trabajo físico actual (todos los enlaces simbólicos resueltos) " y por lo tantofuncionará también.
Conclusión: combine 1 con 2 para satisfacer sus dos requisitos, mientras que los nombres de ruta que contienen espacios ya se tienen en cuenta en los 3 más concisos .
fuente