jueves, 5 de septiembre de 2013

Búsqueda de ficheros. Terminal, ls y tree

En ocasiones es necesario encontrar ficheros que hemos utilizado -o no- en el pasado y que tenemos almacenados en el disco duro. Muchos años atras, cuando el disco duro tenía 40 MB y había 10 usuarios por ordenador los ficheros se guardaban en disquetes y eran fáciles de encontrar, pero hoy, con discos de hasta 4 TB, la información se almacena el disco duro y, con suerte, en una copia externa en otro disco duro. Este sistema nuevo de manejar la información nos pone ante discos duros con cientos de miles de ficheros en decenas de miles de directorios. Incluso el almacenamiento en la nube está saturado de decenas de miles. Como ejemplo, mi Dropbox, que tiene solo lo que estoy usando actualmente para trabajar ha llegado a 23 GB y decenas de miles de ficheros; véase


y el directorio de usuario tiene más de medio millón de ficheros


Por supuesto, cuando es necesario encontrar algún fichero de los trabajos de hace 20 años, o incluso 8, como me ha pasado a mi la semana pasada, a veces los ficheros no se encuentran fácilmente, bien por que ahora usamos una lógica distinta a la que usábamos antes para los nombres de los directorios o de los ficheros o por que los hemos recolocado una y otra vez a lo largo de los años. He estado toda la semana encontrando una solución en terminal, partiendo de una orden ls general, que luego tunelizaba hasta un filtro grep basándome con un pequeño grupo de caracteres que debieran estar en el nombre de esos ficheros.
Para verlo pondremos un ejemplo, partiendo de los ficheros CR2 que hemos estado utilizando para la entrada anterior; si tecleamos

ls -Rla | grep CR2

obtenemos lo siguiente,


Vemos los ficheros, pero no sabemos donde están. Cada letra de las opciones son para algo
R - orden recursiva. Así, mira todos los subdirectorios del directorio donde la hemos lanzado (en est aso, el home de usuario (más de 50.000 directorios y 600.000 ficheros)
l - nos da información de los permisos, el propietario y grupo del fichero, los inodos, su tamaño y nombre; sin embargo, no nos da la ruta absoluta
a - muestra todos los ficheros y directorios, incluidos los ocultos

Eso nos deja con la tranquilidad de ver que están, pero sin saber exactamente donde. Para ello debemos usar el comando tree (como muy amablemente me indicó ayer mi amigo hckorootx). Si ejecutamos

tree -afiR $PWD | grep CR2

obtenemos lo que queríamos, la ruta completa a los ficheros


Las opciones incluidas son:
a -  de nuevo incluye los ficheros ocultos
f - está es la opción que nos transmite las rutas completas de los ficheros
i - evita que la ruta quede dibujada en líneas de indentación de los directorios, que es difícil de leer
R - búsqueda recursiva en todos lo subdirectorios

Si no incluimos $pwd, obtenemos la ruta a partir del directorio base del usuario que ha ejecutado


Eso sí,Linux diferencia mayúsculas de minúsculas, así que si hubieramos pedido

tree -afiR $PWD | grep cr2

hubiera salido otra cosa


Para evitar eso, y teniendo enuenta que s muy difícil recordar que tipo de letra usábamos hace tiempo (y sobre todo en windows, que no diferencia mayúsculas y minúsculas), debemos incluir la opción -i en el filtrado realizado por grep


tree -afiR $PWD | grep -i cr2


Perfecto.



1 comentario:

  1. Otra posible forma sería con "find":

    # find `pwd` | grep -i cr2

    donde `pwd` tiene la misma función que en el uso de "tree".

    ResponderEliminar