¿Cómo puedo generar una lista de archivos con su ruta absoluta en Linux?

304

Estoy escribiendo un script de shell que toma rutas de archivos como entrada.

Por esta razón, necesito generar listados de archivos recursivos con rutas completas. Por ejemplo, el archivo bartiene la ruta:

/home/ken/foo/bar

pero, por lo que puedo ver, ambos lsy findsolo dan listados de rutas relativas:

./foo/bar   (from the folder ken)

Parece un requisito obvio, pero no puedo ver nada en las páginas findo lsman.

¿Cómo puedo generar una lista de archivos en el shell incluyendo sus rutas absolutas?

Conocido
fuente
uso:find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
Estudiante

Respuestas:

305

Si da finduna ruta absoluta para comenzar, imprimirá rutas absolutas. Por ejemplo, para buscar todos los archivos .htaccess en el directorio actual:

find "$(pwd)" -name .htaccess

o si su shell se expande $PWDal directorio actual:

find "$PWD" -name .htaccess

find simplemente antepone la ruta que se le dio a una ruta relativa al archivo desde esa ruta.

Greg Hewgill también sugirió usar pwd -Psi desea resolver enlaces simbólicos en su directorio actual.

Matthew Scharley
fuente
99
Tenga en cuenta que si también desea resolver enlaces simbólicos, use pwd -P.
Greg Hewgill
55
Esto es útil, pero creo que la respuesta de user431529 a continuación es más válida: ls -d -1 $PWD/**/*pero creo que find $PWDtambién funciona (probado en bash)
Brian
99
@Brian ¿Por qué? find $PWDes simple. El lsencantamiento es complejo y difícil de manejar (a menos que lo alias). findno depende de las expansiones de glob de shell, por lo que funcionará en cualquier shell. findtambién es mucho más flexible, puedo obtener una lista recursiva de todos los archivos, o tal vez de todos los directorios, o tal vez quiero una lista de todos los archivos xml, o todos los archivos cambiados en la última semana. Todo eso es posible con find, pero no fácilmente con ls.
Matthew Scharley
12
Tuve que usar find "`pwd`" -name .htaccessdebido a los espacios en los nombres de directorio
Paulo Casaretto
No lo entiendo, este comando no me da la ruta absoluta del archivo I, mientras que otras respuestas en la lista hacen el trabajo.
Bjørn Otto Vasbotten
202
readlink -f filename 

da el camino absoluto completo. pero si el archivo es un enlace simbólico, obtendrás el nombre final resuelto.

balki
fuente
8
Agradable. No funciona en la variante BSD de readlink (es decir, Mac). Uso gnucoreutils en mac. Y por lo tanto, puede usar greadlink que funciona con la solución anterior.
sheki
12
No vaya a Mac OS X.
Andrew Lazarus
1
@AndrewLazarus - Para Mac OS X, use realpathen su lugar
cz
si instala herramientas de bash a través de brew install coreutils, a continuación, el ejecutable se instalará como/usr/local/opt/coreutils/libexec/gnubin/readlink
el aroma
121

Use esto para directorios ( se necesita el /after **en bash para limitarlo a directorios):

ls -d -1 "$PWD/"**/

esto para archivos y directorios directamente debajo del directorio actual, cuyos nombres contienen .:

ls -d -1 "$PWD/"*.*

esto para todo:

ls -d -1 "$PWD/"**/*

Tomado de aquí http://www.zsh.org/mla/users/2002/msg00033.html

En bash, **es recursivo si lo habilitas shopt -s globstar.

usuario431529
fuente
1
ls -d -1 $ PWD / ** / * no se repite. Ojalá pudiera recuperar mi +1. Sin embargo, puedes hacer ** para cada profundidad que necesites ir.
user606723
44
El operador ** es un operador de recursivo globbing. Si usa el comando en un shell que lo admite (como zsh), funcionará correctamente.
zebediah49
ls -d1 "$ PWD /"{*,.*} para capturar también los archivos ocultos (punto). Para mí, la versión recursiva en la respuesta no antepuso la ruta absoluta a los archivos en subcarpetas.
Zael
Creo que tendré que usar find ... obtengo -> bash: / bin / ls: Lista de argumentos demasiado larga
TelamonAegisthus
30

Puedes usar

find $PWD 

en bash

Vinko Vrsalovic
fuente
3
Eso le dará la ruta del directorio actual, y también todos los archivos y directorios debajo de él. Probablemente eso no sea lo que la gente está buscando.
Bill
18
ls -d "$PWD/"*

Esto solo se ve en el directorio actual . Cita "$ PWD" en caso de que contenga espacios.

hice
fuente
Esta sigue siendo una respuesta muy válida, pero sería bueno incluir la información de que esto no funciona de forma recursiva (¡de hecho, eso es lo que estaba buscando!)
bbbco
1
Para uso recursivo: buscar. -exec ls -ld $ PWD / {} \;
Estudiante
10

Mando: ls -1 -d "$PWD/"*

Esto le dará las rutas absolutas del archivo como a continuación.

[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt
GSM
fuente
8

La $PWDes una buena opción de Matthew arriba. Si desea que solo se impriman archivos, también puede agregar la opción -type f para buscar solo archivos normales. Otras opciones son "d" solo para directorios, etc. Entonces, en su caso, sería (si quiero buscar solo archivos con .c ext):

find $PWD -type f -name "*.c" 

o si quieres todos los archivos:

find $PWD -type f

Nota: No puede crear un alias para el comando anterior, porque $ PWD se completa automáticamente en su directorio de inicio cuando bash establece el alias.

Gurpreet
fuente
En realidad, -d no significa solo directorios, significa que trata los directorios como archivos. Entonces, si usted es -d / home, obtendrá "/ home", no una lista de lo que hay en / home.
Travis
@Travis: estaba hablando de la opción de encontrar, no ls. En su caso, "find / -type d" solo encontraría directorios, como él dijo.
oligofren
6

Si le da al comando find una ruta absoluta, escupirá los resultados con una ruta absoluta. Entonces, desde el directorio de Ken si tuviera que escribir:

find /home/ken/foo/ -name bar -print    

(en lugar de la ruta relativa find . -name bar -print)

Deberías obtener:

/home/ken/foo/bar

Por lo tanto, si desea un ls -ly hacer que devuelva la ruta absoluta, puede decirle al comando find que ejecute un ls -len lo que encuentre.

find /home/ken/foo -name bar -exec ls -l {} ;\ 

NOTA: hay un espacio entre {}y;

Obtendrás algo como esto:

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

Si no está seguro de dónde está el archivo, siempre puede cambiar la ubicación de búsqueda. Siempre que la ruta de búsqueda comience con "/", obtendrá una ruta absoluta a cambio. Si está buscando una ubicación (como /) donde obtendrá muchos errores de permiso denegado, entonces recomendaría redirigir el error estándar para que pueda ver los resultados de la búsqueda:

find / -name bar -exec ls -l {} ;\ 2> /dev/null

( 2>es la sintaxis para los shells Borne y Bash, pero no funcionará con el shell C. Puede funcionar también en otros shells, pero solo sé con certeza que funciona en Bourne y Bash).

Trudius
fuente
Puede pasar múltiples argumentos al mismo lsproceso con -exec ls -ld {} +. (Probablemente no desee -dtener lscontenidos de directorio de lista). O mejor, use find integrado lscon find ... name bar -ls. Además, tiene la sintaxis incorrecta para un argumento por comando: debe citar el punto y coma del shell, así que es {} \;.
Peter Cordes
5

fd

Usando fd(alternativa a find), use la siguiente sintaxis:

fd . foo -a

¿Dónde .está el patrón de búsqueda y fooes el directorio raíz?

Por ejemplo, a la lista de todos los archivos de etcforma recursiva, ejecute: fd . /etc -a.

-a, --absolute-path Mostrar rutas absolutas en lugar de relativas

kenorb
fuente
3

Solo una alternativa a

ls -d "$PWD/"* 

para señalar que *es la expansión de shell, así

echo "$PWD/"*

haría lo mismo (el inconveniente que no puede usar -1para separar por nuevas líneas, no espacios).

Marisha
fuente
¿Puedes elaborar más sobre esto? ¿Qué es una expansión de shell? ¿Cómo usar -1para separar por líneas?
Antonio Araujo
@Antonio Araujo, la expansión de shell es el shell (por ejemplo, bash) reemplazará * con la lista de archivos; puede leer más en la página del manual de bash. -1 es la opción de comando ls, echo es otro comando, no tiene las mismas opciones.
Marisha
1
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }
rxw
fuente
1

Aquí hay un ejemplo que imprime una lista sin un período adicional y que también muestra cómo buscar una coincidencia de archivo. Espero que esto ayude:

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
Mike Behr
fuente
1

Esto funcionó para mí. Pero no figuraba en orden alfabético.

find "$(pwd)" -maxdepth 1

Este comando enumera alfabéticamente y también enumera los archivos ocultos.

ls -d -1 "$PWD/".*; ls -d -1 "$PWD/"*;
Raveen Kumar
fuente
1

stat

Ruta absoluta de un solo archivo:

stat -c %n "$PWD"/foo/bar
kenorb
fuente
1

Es posible que desee probar esto.

for name in /home/ken/foo/bar/*
do
    echo $name
done

Puede obtener la ruta del ABS usando el forbucle y echosimplemente sin él find.

fangxl mr
fuente
0

Si necesita una lista de todos los archivos en los subdirectorios actuales

find $PWD -type f

Si necesita una lista de todos los archivos solo en el directorio actual

find $PWD -maxdepth 1 -type f
Thyag
fuente
0

Esto le dará la ruta canónica (resolverá los enlaces simbólicos): realpath FILENAME

Si desea la ruta canónica al enlace simbólico mismo, entonces: realpath -s FILENAME

JGurtz
fuente
0

La mayoría de los métodos sugeridos, si no todos, dan como resultado rutas que no se pueden usar directamente en algún otro comando de terminal si la ruta contiene espacios. Idealmente, los resultados tendrán barras inclinadas antepuestas. Esto funciona para mí en macOS:

find / -iname "*SEARCH TERM spaces are okay*" -print 2>&1  | grep -v denied |grep -v permitted |sed -E 's/\ /\\ /g'
Adán
fuente
-1

find / -print hará esto

David Arno
fuente
1
... desafortunadamente hará algo más (como mostrar 'algunos' otros archivos a menos que se filtre)
DerMike
-1
ls -1 | awk  -vpath=$PWD/ '{print path$1}'
Albert
fuente