Obtenga la ruta absoluta de los archivos con el comando 'buscar'

26

¿Hay alguna manera de obtener la ruta absoluta de un archivo que se está buscando?

Por ejemplo:

find .. -name "filename"

Me da resultados como ../filenamepero quiero el camino completo.

Lo que necesito es encontrar en el directorio principal y sus hijos, para un archivo específico, que utilizaré en otro script más adelante.

Gracias

JorgeeFG
fuente
1
Pregunta similar sobre SO .
Glutanimate

Respuestas:

15

Intenta algo como:

find "$(cd ..; pwd)" -name "filename"
Escrutador
fuente
Gracias, solo estaba probando $(cd ..; pwd). Aquí funciona bien, pero si lo hago solo en una Terminal, no puedo obtener el directorio principal ... Obtengo "Bash: <dir>: es un directorio. Y si lo hago $(cd ..; echo "something"), obtengo" algo: no un comando "
JorgeeFG
¿Te refieres a un comando separado? Entonces, deberías dejar de lado el signo del dólar:(cd ..; pwd)
Scrutinizer
Gracias, eso fue todo. Cualquier referencia de por qué debería eliminar $, ¿cómo afecta a la subshell?
JorgeeFG
1
( ... )significa ejecutar en una subshell, la salida se escribe en stdout. $( ... )significa "sustitución de comando". Este último puede usarse como si fuera una expansión variable.
Scrutinizer
find / -name "filename"
Panther
12

Intenta usar la -execopción de find:

find .. -name "filename" -exec readlink -f {} \;

Nota: readlinkimprime el valor de un enlace simbólico o un nombre de archivo canónico.

Sylvain Pineau
fuente
Esto llamará a readlink en cada archivo, por lo que será muy ineficaz.
Bac0n
9

Puede usar bashla expansión de Tilde para obtener la ruta absoluta del directorio de trabajo actual, de esta manera también se findimprime la ruta absoluta para los resultados:

find ~+ -type f -name "filename"

Si se ejecuta en ~/Desktop, esto se expande a

find /home/yourusername/Desktop -type f -name "filename"

e imprime resultados como:

/home/yourusername/Desktop/filename

Si desea utilizar este enfoque con el directorio principal del directorio de trabajo actual , debe hacerlo cdantes de llamar find:

cd .. && find ~+ -type f -name "filename"
postre
fuente
7

La forma más simple es

find "$(pwd -P)" -name "filename"
Vivek
fuente
¡Sí! Ofind `pwd -P` -name "filename"
Apollys apoya a Monica el
esto encontrará archivos en el directorio actual no de padre.
Bac0n
1

También usar PWD puede mostrarle el directorio completo. Pwd le mostrará a todos sus directores en los que se encuentra, como la expansión del nombre de archivo. Espero que esto haya ayudado.

Sir_Dippingsauce
fuente
1

Esto funcionó para mí, pero solo devolverá la primera vez.

realpath $(find . -type f -name filename -print -quit)

Para obtener rutas completas para todas las ocurrencias (como lo sugiere Sergiy Kolodyazhnyy)

find . -type f -name filename | xargs realpath
Wyrmwood
fuente
Comentario anterior eliminado, +1, buen trabajo @Wyrmwood
Sergiy Kolodyazhnyy
1

Eliminando el último componente del directorio con el parámetro Expansión .

find "${PWD%/*}" -name 'filename'

Un ejemplo de cómo puede usar mapfile para guardar la salida de find en una matriz indexada para su uso posterior.

mapfile -t -d '' < <(find ${PWD%/*} -name 'filename' -print0)

(si no se especifica ningún nombre de matriz, MAPFILE será el nombre de matriz predeterminado).

for i in "${MAPFILE[@]}"; do
    echo "$((n++)) $i"
done
bac0n
fuente