Respuestas:
Use readlink :
readlink -f file.txt
brew install coreutils
luegogreadlink -f file.txt
Supongo que estás usando Linux.
Encontré una utilidad llamada realpath
en coreutils 8.15.
realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt
Según los comentarios de @ styrofoam-fly y @ arch-standton, realpath
solo no verifica la existencia del archivo, para resolver esto agregue el e
argumento:realpath -e file
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 la readlink
sugerencia) en marzo de 2011 :)
realpath -e
imprime un error si el argumento no existe.
Lo siguiente generalmente hace el truco:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
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 ...
jcomeau@intrepid:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav
jcomeau@intrepid:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav
find $PWD -type f | grep "filename"
o
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
Shift
presionado 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.realpath yourfile
para obtener la ruta completa de un archivo según lo sugerido por otros.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 decir
$ which ls
/bin/ls
Hay algunas advertencias a esto; consulte https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .
Funciona en Mac, Linux, * nix:
Esto le dará un csv citado de todos los archivos en el directorio actual:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
El resultado de esto se puede copiar fácilmente en una lista de Python o en cualquier estructura de datos similar.
Puede usar el script fpn (nombre de ruta completo) :
% pwd
/Users/adamatan/bins/scripts/fpn
% ls
LICENSE README.md fpn.py
% fpn *
/Users/adamatan/bins/scripts/fpn/LICENSE
/Users/adamatan/bins/scripts/fpn/README.md
/Users/adamatan/bins/scripts/fpn/fpn.py
fpn
no es un paquete estándar de Linux, pero es un proyecto github gratuito y abierto y puede configurarlo en un minuto .
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:
abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }
Uso:
$ abspath file.txt
/I/am/in/present/dir/file.txt
Uso con ruta relativa:
$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt
Con espacios en el nombre del archivo:
$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt
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_dir
contendrá/home/abc/sandbox/v1/../../test
./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) 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 FILE
y 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 -f
y realpath
deberían funcionar de manera predeterminada para los usuarios que no son Mac Unix.
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
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
seEsto 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 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.
basePath=`dirname \`readlink -e $0\``
Entonces puedo usar la ${basePath}
variable en mis scripts para hacer referencia directa a otros scripts.
Espero que esto ayude,
Dave
Puede guardar esto en su shell.rc
o simplemente ponerlo en la consola
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
ejemplo:
ap somefile.txt
saldrá
/home/user/somefile.txt
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.
find / -samefile file.txt -print
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 si find
no comienza en un directorio en el mismo dispositivo que file.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:
find /bin -samefile /bin/gunzip -ls
Saldrá:
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/uncompress
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/gunzip
Esto funciona con Linux y Mac OSX.
echo $(pwd)$/$(ls file.txt)
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.
En mac mencionado a continuación, la línea funciona. No es necesario agregar líneas elegantes.
> pwd filename
print working directory
En Mac OSX, realice los siguientes pasos:
cd
en el directorio del archivo de destino.ls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txt
con su nombre de archivo real.Junto a "readlink -f", otro comando de uso común:
$find /the/long/path/but/I/can/use/TAB/to/auto/it/to/ -name myfile /the/long/path/but/I/can/use/TAB/to/auto/it/to/myfile $
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.
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:
abspath() { echo $(pwd "$1")/"$1"; }
Ahora puede encontrar cualquier ruta de archivo:
abspath myfile.ext