¿Cómo obtener la ruta completa de un archivo?

719

¿Hay alguna manera fácil de imprimir la ruta completa file.txt?

file.txt = /nfs/an/disks/jj/home/dir/file.txt

los <command>

dir> <command> file.txt  

debería imprimir

/nfs/an/disks/jj/home/dir/file.txt
Vaquero
fuente

Respuestas:

1189

Use readlink :

readlink -f file.txt
filmor
fuente
32
Para eso es '-f'.
filmor
55
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.

realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt

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

lllllllllllll
fuente
Funciona con cygwin (con mintty 2.7.9)
Scrambo
1
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.
Arch Stanton
77

Lo siguiente generalmente hace el truco:

 echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
ZeRemz
fuente
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)
DeeJ
1
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
stiemannkj1
77
@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 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
jcomeau_ictx
fuente
26
find $PWD -type f | grep "filename"

o

find $PWD -type f -name "*filename*"
Anshul Gupta
fuente
1
Para mí, en Mac, esto funcionó - en lugar de $ pwd -find `pwd` -type file -name \*.dmp
mrwaim
14

Si está en el mismo directorio que el archivo:

ls "`pwd`/file.txt"

Reemplace file.txtcon su nombre de archivo de destino.

Steven
fuente
99
también puedes hacerloecho $(pwd)/file.txt
Alex
12

En Windows:

  • 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.
Natesh Bhat
fuente
4

Sé que esta es una vieja pregunta ahora, pero solo para agregar a la información aquí:

El comando de Linux whichse 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/ .

Señor gato
fuente
55
Esta respuesta es demasiado específica, el OP no se trata de encontrar comandos.
AL
4

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.

Bhargav Srinivasan
fuente
imprime ruta pwd actual
Sand1512
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'.
Bhargav Srinivasan
3

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

fpnno es un paquete estándar de Linux, pero es un proyecto github gratuito y abierto y puede configurarlo en un minuto .

Adam Matan
fuente
1
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; }

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
Ramu
fuente
2

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

Ackq
fuente
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.

JacobWuzHere
fuente
2
brew install coreutils
A Kra
2
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

Esta es la explicación de lo que está sucediendo en la respuesta de @ ZeRemz :

  1. Este script obtiene una ruta relativa como argumento "$1"
  2. Entonces conseguimos nombredir parte de ese camino (se puede pasar a cualquiera dir o archivo a esta secuencia de comandos):dirname "$1"
  3. Entonces entramos cd "$(dirname "$1")en este directorio relativo
  4. && pwd -Py obtener el camino absoluto para ello. -Pla opción evitará todos los enlaces simbólicos
  5. Después de eso agregamos basename a la ruta absoluta:$(basename "$1")
  6. Como paso final que echose
Eugen Konkov
fuente
1

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} \'
}
Russell Speight
fuente
1

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}
Andrew Miller
fuente
0

Generalmente:

find `pwd` | grep <filename>

Alternativamente, solo para la carpeta actual:

find `pwd` -maxdepth 1 | grep <filename>
sjas
fuente
hm por qué el odio?
sjas
0

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.

Espero que esto ayude,

Dave

Dave Rix
fuente
0

Puede guardar esto en su shell.rco simplemente ponerlo en la consola

function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"

ejemplo:

ap somefile.txt

saldrá

/home/user/somefile.txt
Roman Rhrn Nesterov
fuente
3
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:

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
wildplasser
fuente
-1

Esto funcionará tanto para el archivo como para la carpeta:

getAbsolutePath(){
    [[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } || 
    { cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}
Jahid
fuente
-1

Esto funciona con Linux y Mac OSX.

 echo $(pwd)$/$(ls file.txt)
Ahmed Abobakr
fuente
-1

Otra utilidad de Linux, que hace este trabajo:

fname <file>
BluVio
fuente
-1

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.

Richard Sharpe
fuente
-1

En mac mencionado a continuación, la línea funciona. No es necesario agregar líneas elegantes.

> pwd filename
Sanjeet kumar
fuente
66
No, solo imprime el directorio de trabajo (sin el nombre del archivo) como sugiere el nombre del comandoprint working directory
anilbey
-2
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}

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)

Dhruv
fuente
-2

la forma más fácil que encontré es

for i in `ls`; do echo "`pwd`/$i"; done

me funciona bien

onkar
fuente
-2

En Mac OSX, realice los siguientes pasos:

  1. cd en el directorio del archivo de destino.
  2. Escriba cualquiera de los siguientes comandos de terminal.
Terminal
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. Reemplace file.txtcon su nombre de archivo real.
  2. prensa Enter
Déjame pensarlo
fuente
-3

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 -fcomando es el correcto.

Andrew_1510
fuente
-3

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
Néstor Urquiza
fuente