Pregunta

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

Por este motivo, necesito generar listados de archivos recursivos con rutas completas. Por ejemplo, el archivo bar tiene la ruta:

/home/ken/foo/bar

pero, por lo que puedo ver, tanto ls como find solo dan listados de rutas relativas:

./foo/bar   (from the folder ken)

Parece un requisito obvio, pero no puedo ver nada en las páginas de comando man find o ls .

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

¿Fue útil?

Solución

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

o si su shell expande $ PWD al 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 -P si desea resolver los enlaces simbólicos en su directorio actual.

Otros consejos

readlink -f filename 

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

Use esto para dirs (el / después de ** es necesario en bash para limitarlo a los directorios):

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

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

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 habilitas shopt -s globstar .

Puedes usar

find $PWD 

en bash

ls -d "$PWD/"*

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

El $ PWD es una buena opción de Matthew en la parte superior. Si desea buscar solo imprimir archivos, también puede agregar la opción -type f para buscar solo archivos normales. Otras opciones son " d " solo para directorios, etc. Así que en su caso sería (si quisiera 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.

Si le asigna al comando de búsqueda 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 -l y hacer que devuelva la ruta absoluta, puede indicarle al comando find que ejecute un ls -l en lo que sea encuentra.

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 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. También puede funcionar en otros shells, pero solo sé con certeza que funciona en Bourne y Bash).

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

Esto le dará las rutas absolutas del archivo como se muestra 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
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }

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

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

find / -print hará esto

ls -1 | awk  -vpath=$PWD/ '{print path$1}'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top