Acabo de probar en 10.9.2, funciona bien. que readlink / usr / local / opt / coreutils / libexec / gnubin / readlink readlink --version readlink (GNU coreutils) 8.22
J0hnG4lt
10
@ J0hnG4lt: eso se debe a que instaló coreutils con homebrew y cambió su RUTA para apuntar a los binarios no prefijados. Instalar coreutils, dejar solo PATH y usar "greadlink" también funcionaría.
Tim Smith
35
en MAC: instale homebrew y brew install coreutilsluegogreadlink -f file.txt
Para Kra
217
Supongo que estás usando Linux.
Encontré una utilidad llamada realpathen coreutils 8.15.
Según los comentarios de @ styrofoam-fly y @ arch-standton, realpathsolo no verifica la existencia del archivo, para resolver esto agregue el eargumento:realpath -e file
realpathestaba comprometido con el repositorio de coreutils a finales de 2011, la versión 8.15 se realizó en enero de 2012, respondí la pregunta (con la readlinksugerencia) en marzo de 2011 :)
filmor
2
realpath no verifica la existencia del archivo, solo resuelve las rutas. Solicitar una ruta completa de un archivo no existente debería dar como resultado un error.
espuma de poliestireno vuela el
44
@styrofoamfly realpath -eimprime un error si el argumento no existe.
Hola. Encontré esta respuesta mejor a mi requerimiento. ¿Puede explicar cómo puedo usar una variable local en lugar del parámetro de línea de comando (es decir, $ 1)
@SopalajodeArrierez Debido a readlinkque no funciona si el archivo es un enlace simbólico, le mostrará el objetivo del enlace simbólico en lugar del enlace simbólico en sí.
qwertzguy
1
Me gusta esto, porque readlinkme lleva de vuelta al directorio principal desde donde se genera el enlace simbólico, pero esto lo ignora.
Sukhi
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ### Salida: / home / ravi / ..
Tom Hale
35
Yo sé que hay una manera más fácil que esto, pero aspen si puedo encontrarlo ...
Mantener Shiftpresionado y hacer clic derecho en un archivo en el Explorador de Windows le brinda una opción llamada Copy as Path. Esto copiará la ruta completa del archivo al portapapeles.
En Linux:
Puede usar el comando realpath yourfilepara obtener la ruta completa de un archivo según lo sugerido por otros.
Sí, las rutas completas separadas por comas para todos los archivos en pwd, para un archivo simplemente haga ls 'nombre de archivo' en lugar de solo 'ls'.
En general, pwdpor sí solo debería funcionar bien en Linux y en la mayoría de los demás entornos de SO similares a Unix.
karolus
3
Puedes usar esta función. Si el nombre del archivo se proporciona sin una ruta relativa, se supone que está presente en el directorio de trabajo actual:
abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }
En un escenario similar, estoy lanzando un script cshell desde otra ubicación. Para configurar la ruta absoluta correcta del script para que se ejecute solo en el directorio designado, estoy usando el siguiente código:
set script_dir = `pwd`/`dirname $0`
$0 almacena la cadena exacta de cómo se ejecutó el script.
Por ejemplo, si el guión se puso en marcha la siguiente manera: $> ../../test/test.csh,
$script_dircontendrá/home/abc/sandbox/v1/../../test
votó por esto, ya que es el más fácil y relevante. Sin embargo, si escribe ./test.csh, tendrá un camino que termina en/test/.
vinilo el
2
Para Mac OS X, reemplacé las utilidades que vienen con el sistema operativo y las reemplacé con una versión más nueva de coreutils. Esto le permite acceder a herramientas como readlink -f(para la ruta absoluta a los archivos) y realpath(ruta absoluta a los directorios) en su Mac.
La versión Homebrew agrega una 'G' (para GNU Tools) delante del nombre del comando, por lo que los equivalentes se convierten en greadlink -f FILEy grealpath DIRECTORY.
Puede encontrar instrucciones sobre cómo instalar Coreutils / GNU Tools en Mac OS X a través de Homebrew en este artículo de StackExchange .
NB: Los comandos readlink -fy realpathdeberían funcionar de manera predeterminada para los usuarios que no son Mac Unix.
Esto funcionó bastante bien para mí. No depende del sistema de archivos (un pro / con según la necesidad), por lo que será rápido; y debería ser portátil para la mayoría de cualquier * NIX. Asume que la cadena pasada es de hecho relativa a la PWD y no a algún otro directorio.
function abspath () {
echo $1 | awk '\
# Root parent directory refs to the PWD for replacement below
/^\.\.\// { sub("^", "./") } \
# Replace the symbolic PWD refs with the absolute PWD \
/^\.\// { sub("^\.", ENVIRON["PWD"])} \
# Print absolute paths \
/^\// {print} \'
}
Esto es ingenuo, pero tuve que hacer que sea compatible con POSIX. Requiere permiso para cd en el directorio del archivo.
#!/bin/sh
if [ ${#} = 0 ]; then
echo "Error: 0 args. need 1" >&2
exit 1
fi
if [ -d ${1} ]; then
# Directory
base=$( cd ${1}; echo ${PWD##*/} )
dir=$( cd ${1}; echo ${PWD%${base}} )
if [ ${dir} = / ]; then
parentPath=${dir}
else
parentPath=${dir%/}
fi
if [ -z ${base} ] || [ -z ${parentPath} ]; then
if [ -n ${1} ]; then
fullPath=$( cd ${1}; echo ${PWD} )
else
echo "Error: unsupported scenario 1" >&2
exit 1
fi
fi
elif [ ${1%/*} = ${1} ]; then
if [ -f ./${1} ]; then
# File in current directory
base=$( echo ${1##*/} )
parentPath=$( echo ${PWD} )
else
echo "Error: unsupported scenario 2" >&2
exit 1
fi
elif [ -f ${1} ] && [ -d ${1%/*} ]; then
# File in directory
base=$( echo ${1##*/} )
parentPath=$( cd ${1%/*}; echo ${PWD} )
else
echo "Error: not file or directory" >&2
exit 1
fi
if [ ${parentPath} = / ]; then
fullPath=${fullPath:-${parentPath}${base}}
fi
fullPath=${fullPath:-${parentPath}/${base}}
if [ ! -e ${fullPath} ]; then
echo "Error: does not exist" >&2
exit 1
fi
echo ${fullPath}
Me gustan muchas de las respuestas ya dadas, pero he encontrado esto realmente útil, especialmente dentro de un script para obtener la ruta completa de un archivo, incluidos los siguientes enlaces simbólicos y referencias relativas como .y..
dirname `readlink -e relative/path/to/file`
Lo que devolverá la ruta completa de la fileruta raíz en adelante. Esto se puede usar en un script para que el script sepa desde qué ruta se está ejecutando, lo cual es útil en un clon de repositorio que podría ubicarse en cualquier lugar de una máquina.
basePath=`dirname \`readlink -e $0\``
Entonces puedo usar la ${basePath}variable en mis scripts para hacer referencia directa a otros scripts.
Pero luego ap ../foobar.txtdará /home/user/../foobar.txt, que generalmente no es lo que quieres.
bdesham
2
También ap /tmp/foobar.txtdará /home/user//tmp/foobar.txt, que está mal.
David Dado
-1
find / -samefile file.txt -print
Encontrará todos los enlaces al archivo con el mismo número de inodo que file.txt
agregar una -xdevbandera evitará findcruzar los límites del dispositivo ("puntos de montaje"). (Pero esto probablemente no hará que se encuentre nada si findno comienza en un directorio en el mismo dispositivo que file.txt)
Tenga en cuenta que findpuede informar múltiples rutas para un solo objeto de sistema de archivos, porque un Inode puede estar vinculado por más de una entrada de directorio, posiblemente incluso usando diferentes nombres. Por ejemplo:
Para Mac OS, si solo desea obtener la ruta de un archivo en el buscador, haga clic en el archivo y desplácese hacia abajo hasta "Servicios" en la parte inferior. Obtiene muchas opciones, incluyendo "copiar ruta" y "copiar ruta completa". Al hacer clic en uno de estos, se coloca la ruta en el portapapeles.
brew install coreutils
luegogreadlink -f file.txt
Supongo que estás usando Linux.
Encontré una utilidad llamada
realpath
en coreutils 8.15.Según los comentarios de @ styrofoam-fly y @ arch-standton,
realpath
solo no verifica la existencia del archivo, para resolver esto agregue ele
argumento:realpath -e file
fuente
realpath
estaba comprometido con el repositorio de coreutils a finales de 2011, la versión 8.15 se realizó en enero de 2012, respondí la pregunta (con lareadlink
sugerencia) en marzo de 2011 :)realpath -e
imprime un error si el argumento no existe.Lo siguiente generalmente hace el truco:
fuente
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
que no funciona si el archivo es un enlace simbólico, le mostrará el objetivo del enlace simbólico en lugar del enlace simbólico en sí.readlink
me lleva de vuelta al directorio principal desde donde se genera el enlace simbólico, pero esto lo ignora.set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### Salida: / home / ravi / ..Yo sé que hay una manera más fácil que esto, pero aspen si puedo encontrarlo ...
fuente
o
fuente
find `pwd` -type file -name \*.dmp
Si está en el mismo directorio que el archivo:
Reemplace
file.txt
con su nombre de archivo de destino.fuente
echo $(pwd)/file.txt
En Windows:
Shift
presionado y hacer clic derecho en un archivo en el Explorador de Windows le brinda una opción llamadaCopy as Path
. Esto copiará la ruta completa del archivo al portapapeles.En Linux:
realpath yourfile
para obtener la ruta completa de un archivo según lo sugerido por otros.fuente
Sé que esta es una vieja pregunta ahora, pero solo para agregar a la información aquí:
El comando de Linux
which
se puede usar para encontrar la ruta del archivo de un archivo de comando, es decirHay algunas advertencias a esto; consulte https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .
fuente
Funciona en Mac, Linux, * nix:
Esto le dará un csv citado de todos los archivos en el directorio actual:
El resultado de esto se puede copiar fácilmente en una lista de Python o en cualquier estructura de datos similar.
fuente
Puede usar el script fpn (nombre de ruta completo) :
fpn
no es un paquete estándar de Linux, pero es un proyecto github gratuito y abierto y puede configurarlo en un minuto .fuente
pwd
por sí solo debería funcionar bien en Linux y en la mayoría de los demás entornos de SO similares a Unix.Puedes usar esta función. Si el nombre del archivo se proporciona sin una ruta relativa, se supone que está presente en el directorio de trabajo actual:
Uso:
Uso con ruta relativa:
Con espacios en el nombre del archivo:
fuente
En un escenario similar, estoy lanzando un script cshell desde otra ubicación. Para configurar la ruta absoluta correcta del script para que se ejecute solo en el directorio designado, estoy usando el siguiente código:
$0
almacena la cadena exacta de cómo se ejecutó el script.Por ejemplo, si el guión se puso en marcha la siguiente manera:
$> ../../test/test.csh
,$script_dir
contendrá/home/abc/sandbox/v1/../../test
fuente
./test.csh
, tendrá un camino que termina en/test/.
Para Mac OS X, reemplacé las utilidades que vienen con el sistema operativo y las reemplacé con una versión más nueva de coreutils. Esto le permite acceder a herramientas como
readlink -f
(para la ruta absoluta a los archivos) yrealpath
(ruta absoluta a los directorios) en su Mac.La versión Homebrew agrega una 'G' (para GNU Tools) delante del nombre del comando, por lo que los equivalentes se convierten en
greadlink -f FILE
ygrealpath DIRECTORY
.Puede encontrar instrucciones sobre cómo instalar Coreutils / GNU Tools en Mac OS X a través de Homebrew en este artículo de StackExchange .
NB: Los comandos
readlink -f
yrealpath
deberían funcionar de manera predeterminada para los usuarios que no son Mac Unix.fuente
brew install coreutils
Esta es la explicación de lo que está sucediendo en la respuesta de @ ZeRemz :
"$1"
dirname "$1"
cd "$(dirname "$1")
en este directorio relativo&& pwd -P
y obtener el camino absoluto para ello.-P
la opción evitará todos los enlaces simbólicos$(basename "$1")
echo
sefuente
Esto funcionó bastante bien para mí. No depende del sistema de archivos (un pro / con según la necesidad), por lo que será rápido; y debería ser portátil para la mayoría de cualquier * NIX. Asume que la cadena pasada es de hecho relativa a la PWD y no a algún otro directorio.
fuente
Esto es ingenuo, pero tuve que hacer que sea compatible con POSIX. Requiere permiso para cd en el directorio del archivo.
fuente
Generalmente:
Alternativamente, solo para la carpeta actual:
fuente
Me gustan muchas de las respuestas ya dadas, pero he encontrado esto realmente útil, especialmente dentro de un script para obtener la ruta completa de un archivo, incluidos los siguientes enlaces simbólicos y referencias relativas como
.
y..
Lo que devolverá la ruta completa de la
file
ruta raíz en adelante. Esto se puede usar en un script para que el script sepa desde qué ruta se está ejecutando, lo cual es útil en un clon de repositorio que podría ubicarse en cualquier lugar de una máquina.Entonces puedo usar la
${basePath}
variable en mis scripts para hacer referencia directa a otros scripts.Espero que esto ayude,
Dave
fuente
Puede guardar esto en su
shell.rc
o simplemente ponerlo en la consolaejemplo:
saldrá
fuente
ap ../foobar.txt
dará/home/user/../foobar.txt
, que generalmente no es lo que quieres.ap /tmp/foobar.txt
dará/home/user//tmp/foobar.txt
, que está mal.Encontrará todos los enlaces al archivo con el mismo número de inodo que file.txt
agregar una
-xdev
bandera evitaráfind
cruzar los límites del dispositivo ("puntos de montaje"). (Pero esto probablemente no hará que se encuentre nada sifind
no comienza en un directorio en el mismo dispositivo quefile.txt
)Tenga en cuenta que
find
puede informar múltiples rutas para un solo objeto de sistema de archivos, porque un Inode puede estar vinculado por más de una entrada de directorio, posiblemente incluso usando diferentes nombres. Por ejemplo:Saldrá:
fuente
Esto funcionará tanto para el archivo como para la carpeta:
fuente
Esto funciona con Linux y Mac OSX.
fuente
Otra utilidad de Linux, que hace este trabajo:
fuente
Para Mac OS, si solo desea obtener la ruta de un archivo en el buscador, haga clic en el archivo y desplácese hacia abajo hasta "Servicios" en la parte inferior. Obtiene muchas opciones, incluyendo "copiar ruta" y "copiar ruta completa". Al hacer clic en uno de estos, se coloca la ruta en el portapapeles.
fuente
En mac mencionado a continuación, la línea funciona. No es necesario agregar líneas elegantes.
fuente
print working directory
Copia el texto en su portapapeles y muestra el texto en la ventana del terminal.
:)
(Copié parte del código de otra respuesta de desbordamiento de pila pero ya no puedo encontrar esa respuesta)
fuente
la forma más fácil que encontré es
me funciona bien
fuente
En Mac OSX, realice los siguientes pasos:
cd
en el directorio del archivo de destino.file.txt
con su nombre de archivo real.fuente
Junto a "readlink -f", otro comando de uso común:
Esto también proporciona la ruta completa y el nombre del archivo en la consola
Fuera de tema: este método solo proporciona enlaces relativos , no absolutos. El
readlink -f
comando es el correcto.fuente
Cree una función como la siguiente (repite la ruta absoluta de un archivo con pwd y agrega el archivo al final de la ruta:
Ahora puede encontrar cualquier ruta de archivo:
fuente