Mi ultimo twitt:

Mi ultima foto en instagram:


El arte de buscar desde la terminal.

[ $date ]# 16 diciembre 2014

Para la mayoría de los linuxeros de hueso colorado esto es cómo el pan de cada día, el buscar desde la terminal se les hace más efectivo que entrar a una UI, aparte de que se ve más “und3rgr0unD”, existen varios comandos con sus diferentes atributos para poder crear la búsqueda perfecta de aquel archivo o palabra dentro de el, la mayoría opta por find qué es uno de los más conocidos.

Digamos que queremos buscar un archivo que se llama index, en el primer find, solo especifico el nombre con -name, el cual no me arroja un resultado, añado * el cual me buscará en cualquier carpeta dentro de donde este buscando, y ha arrojado unos resultados, en el ultimo especifico la carpeta www/ donde buscar:

El comando find, tiene la opción ya sea mayúsculas y minúsculas:

Podemos hacer uso de expresiones irregulares para la búsqueda:

  • “[0-9]*” #Todo lo que comienza con dígitos
  • “[Oo]*” #Todo lo que comienza con la letra “o” mayúscula o minúscula
  • “[b-f]*.txt” #Todo lo que comienza con una letra entre la b y f y sea un .txt

Realizar una búsqueda de archivos ocultos:

El atributo -user nos puede ayudara buscar los archivos que pertenece a cierto usuario, también existe -perm para buscar por permisos:

Para realizar búsquedas por fecha de modificación podemos usar -mmin (minutos), los valores pueden ser indicados de las siguientes formas:

  • +n busca valores mayor que n
  • -n busca valores menor que n
  • n busca exactamente el valor n

El comando find, contiene más atributos para la búsqueda por tiempos: -amin, -atime, -cmin, ctime, -mmin y -mtime (“min” es para periodos de minutos y “time” para periodos de 24 horas.):

Los que empiezan con “a” (access) indica el tiempo en que fue accedido (leido) por última vez un archivo. Los que empiezan con “c” (change) indica el tiempo que cambió por última vez el status de un archivo, por ejemplo sus permisos. Los que empiezan con “m” (modify) indica el tiempo en que fue modificado (escrito) por última vez un archivo. {via Linux Total}

El poder de -exec

-exec permite ejecutar incorporar comandos externos para ejecutar sobre el resultado devuelto por find, este comando fue muy usado cuando los “hackers” hacían un “mass deface” y modificaban todos los index, la ventaja de poder ejecutar comandos hace a -exec algo “especial”… jaja.

En comando anterior sale el atributo -size en cual puse 0 para archivos vacíos, seguido de -exec el cual ejecuta ls que nos devuelve una salida de ls se indica la cadena {} que se sustituye por cada salida de find.

Digamos que sabemos que una persona usa el cliente filezilla y sabemos que los archivos .xml se guardan las configuraciones “las contraseñas” y “usuarios” de sus (s)FTP y nos prestan la maquina y solo tenemos 10 min y un USB:

En el 2011 escribí un post parecido donde el tema era la búsqueda de palabras dentro de los archivos *.html, donde yo use xargs:

En el cual hubo la participación de varios amigos, donde aportaron las diferentes formas que ellos buscaban la cadena en un archivo:

gwolf comment 2011

Existen más comando cómo grep, egrep etc… El cual nos pueden ayudar a realizar búsquedas más poderosas. Por el momento me quedo con find y exec, el cual para mi hacen buena combinación.

Y tú ¿Qué usas para las búsquedas dentro de la terminal?

  • n1x0d4y

    He usado muchas veces find y locate para buscar, muy cierto en la consola la búsqueda es mas rápida, efectiva y no es necesario saber donde están los ficheros.

    Buena entrada bucio.

  • NeoLancer

    Excelente artículo Bucio y si… lo utilizo a diario de hecho jaja.

  • maop

    El grep -Hirn cadena . es para cuando quieres buscar en algunos cuantos archivos, centenas, tal vez un millar a lo máximo.

    El método con find es mas eficiente con grandes, muy grandes cantidades de archivos. Esto es porque el * le dicta a bash que sustituya el * por todos las coincidencias y estas tienen un límite, que creo que es menos de 65K, mientras find como realiza la busqueda a nivel de filesystem va recorriendolos todos sin importar cuantos sean ni donde estén (pues no le preocupa el path, eso lo calcula después con los inodes) no tiene ese problema.

    Ahora, no sé porque el buen gwolf desfavoreció xargs, yo uso xargs junto con find por una gran característica, xargs te permite paralelizar comandos, así por ejemplo un

    find . -type f -iname “*html -print0 | xargs -0 -n1 -P4 grep “cadena” | awk {…procesado del resultado… }

    creará 4 procesos grep paralelos (para un cpu con 4 cores/threads) para tratar los archivos encontrados por find

    Así he procesado minería de datos [en la empresa de hosting donde laboro] en directorios donde, los sistemas de los usuarios estan generarando de 50K a 200K archivos por día, en cuestión de minutos ;)

    Saludos

  • wackO

    Es muy completo, constructivo :)

  • Excelente informacion, muchas gracias! :D