Estoy buscando un comando simple que se pueda usar dentro de Bash para encontrar la ruta absoluta y canonizada a un archivo en un OS X (similar a `` readlink -f '' en Linux).
La siguiente sesión de bash de muestra describe una utilidad [ficticia] llamada `` abspath '' que exhibe el comportamiento deseado:
$ pwd
/Users/guyfleegman
$ ls -lR
drwxr-xr-x 4 guyfleegman crew 136 Oct 30 02:09 foo
./foo:
-rw-r--r-- 1 guyfleegman crew 0 Oct 30 02:07 bar.txt
lrwxr-xr-x 1 guyfleegman crew 7 Oct 30 02:09 baz.txt -> bar.txt
$ abspath .
/Users/guyfleegman
$ abspath foo
/Users/guyfleegman/foo
$ abspath ./foo/bar.txt
/Users/guyfleegman/foo/bar.txt
$ abspath foo/baz.txt
/Users/guyfleegman/foo/baz.txt
Al igual que con la última invocación de `` abspath '' en el ejemplo anterior, preferiría que no resolviera automáticamente los enlaces simbólicos, pero no voy a ser demasiado exigente aquí.
macos
osx-snow-leopard
bash
shell
Michael Wehner
fuente
fuente
Respuestas:
Ejemplos:
fuente
No creo que haya un comando buildin que haga esto. Jesse Wilson escribió un script bash para esto:
Sin embargo, no funciona bien para rutas directamente debajo
/
, como/etc
(impresión//etc
), así como.
y..
(impresión/cwd/.
en ambos casos). Intenté modificarlo, pero mi insuficiente bash-fu me falló.Aquí está mi sugerencia:
Guardar como
/usr/bin/abspath
o algo así y hacerlo ejecutable. Salida de muestra:Si haces querer resolución enlace simbólico, cambiar la
print
línea como la siguiente:para obtener esto:
fuente
file /usr/bin/xattr
Una opción sería simplemente instalar coreutils y usar
greadlink -f
. Resuelve enlaces simbólicos y funciona con/Foo/
o~/foo.txt
si no existen, pero no con/Foo/foo.txt
si/Foo/
no existe.Esto no resuelve los enlaces simbólicos, y tampoco funciona con
/Foo/foo.txt
ninguno.dirs -l
realiza la expansión de tilde.dirs +0
imprime solo el directorio superior si hay otros directorios en la pila.fuente
Supongo que podrías hacerlo con python o ruby.
o convertirlo en un comando con
fuente
Si tiene instalado el módulo File :: Spec para perl, puede hacer esto:
fuente
Para los scripts bash / sh puedes usar esta función recursiva:
fuente
__filename
. El script actualmente se comporta más como dedirname
todos modos.Instale la siguiente biblioteca para OSX:
fuente
Si la instalación de coreutils no es una opción, lo siguiente maneja combinaciones de enlaces simbólicos,. y ... y funciona en archivos y carpetas como lo hace GNU realpath:
Pero no admite realpath's --relative-to. Esto requeriría /programming//a/12498485/869951 .
fuente
Dado que la restricción es MacOS (OS X en ese momento), PHP está disponible por defecto. Esto devolverá el directorio raíz del archivo. Eliminar
dirname
para obtener el archivo también.fuente