2008-10-29 10 views
204

quiero para generar listados de archivos recursivos con rutas completas¿Cómo puedo hacer una lista de archivos con su ruta absoluta en Linux?

/home/ken/foo/bar 

pero por lo que puedo ver tanto ls y find sólo dan listados de ruta relativa

./foo/bar (from the folder ken) 

Parece que un requisito obvio pero no se puede ver nada en las páginas del manual find o ls.

+0

uso: find/home/ken/foo/bar -exec ls -ld $ PWD/{} \; – Learner

Respuesta

213

Si le da a find una ruta absoluta para comenzar, imprimirá rutas absolutas. Por ejemplo, para encontrar todos los archivos .htaccess en el directorio actual:

find `pwd` -name .htaccess 

find simplemente antepone el camino se le dio a una ruta relativa al archivo de ese camino.

Greg Hewgill también sugirieron usar pwd -P si desea resolver enlaces simbólicos en su directorio actual.

+8

Tenga en cuenta que si también desea resolver enlaces simbólicos, use 'pwd -P'. –

+3

Esto es útil, pero creo que la respuesta del usuario431529 a continuación es más válida: 'ls -d -1 $ PWD/**/*' pero supongo 'encontrar $ PWD' también funciona (probado en bash) – Brian

+5

@Brian Why ? 'find $ PWD' es simple. El encantamiento 'ls' es complejo e inmanejable (a menos que lo aliees). 'find' no depende de las expansiones globales de la caparazón, por lo que funcionará en cualquier caparazón. 'find' tambié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 modificados en la última semana. Todo lo que es posible con 'find', pero no fácilmente con' ls'. –

-2

find/-print harán esto

+1

... desafortunadamente hará algo más (como mostrar 'algunos' otros archivos a menos que esté filtrado) – DerMike

18

Usted puede utilizar

find $PWD 

en bash

+0

Eso dará la ruta del directorio actual, y todos los archivos y directorios a continuación también. Probablemente eso no es lo que la gente está buscando. – Bill

11
ls -d $PWD/* 
+1

no funciona recursivamente – danio

+0

Esta sigue siendo una respuesta muy válida, pero sería bueno incluir la información que esto no funciona recursivamente (que es lo que estaba buscando de hecho!) – bbbco

+0

Para uso recursivo: buscar.-exec ls -ld $ PWD/{} \; – Learner

4

Si usted le da el comando Buscar una ruta absoluta, será escupir los resultados con un absoluto camino. Así, desde el directorio Ken si tuviera que escribir:

hallazgo/home/KEN/foo/bar -nombre -print
(en lugar de la ruta relativa encontrar -nombre barra -print.)

Usted debe conseguir:

/home/KEN/foo/bar

por lo tanto, si quieres un ls -l y tiene que devolver la ruta absoluta, sólo puede decirle al comando find para ejecutar un ls -l en lo que sea que encuentre

hallazgo/home/KEN/foo bar -nombre -exec ls -l {}; \

NOTA: Hay un espacio entre {} y;

Usted obtendrá algo como esto:

-rw-r - r-- 1 ken administrador 181 Ene 27 de 15:49/home/KEN/foo/bar

Si usted no está' Asegúrese 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 va a obtener una gran cantidad de permisos denegados, le recomiendo redirigir el error estándar para que pueda ver los resultados de búsqueda:

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

(2> es la sintaxis para shell y bash shell, pero no funciona con c shell.También puede funcionar en otras conchas, pero solo sé con certeza que funciona en bourne y bash).

Espero que esto ayude!

-1
ls -1 | awk -vpath=$PWD/ '{print path$1}' 
+1

No funciona recursivamente – danio

94

Uso esto para directorios:

ls -d -1 $PWD/** 

esto para los archivos:

ls -d -1 $PWD/*.* 

esto para todo:

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

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

+8

ls -d1 $ PWD/* era exactamente lo que estaba buscando –

+0

ls -d -1 $ PWD/**/* no recurse. Desearía poder recuperar mi +1. Puedes hacer ** por cada profundidad que necesites. – user606723

+4

El operador ** es un operador globbing recursivo. Si usa el comando en un shell que lo admita (como zsh), funcionará correctamente. – zebediah49

167
readlink -f filename 

da la ruta absoluta completa. pero si el archivo es un enlace simbólico, obtendrás el nombre final resuelto.

+6

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

+9

No vaya a Mac OS X. –

2

La $PWD es una buena opción de Matthew anterior. Si desea buscar solo para imprimir archivos, también puede agregar la opción -type f para buscar solo archivos normales. Otras opciones son "D" para los directorios sólo etc. Así que en su caso sería (si quiero buscar sólo los archivos con extensión .c):

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

o si desea que 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 el alias se establece mediante bash.

+0

En realidad, -d no solo significa directorios, significa que trata directorios como archivos. Entonces, si tiene -d/home, obtendrá "/ home", no una lista de lo que está en/home. – Travis

+0

@Travis: estaba hablando de la opción de buscar, no de ls. En su caso, "find/-type d" encontraría solo directorios, como él dijo. – oligofren

Cuestiones relacionadas