[+] Inicio | [+] Contacto | [+] Blog



El arte de buscar desde la terminal.

$ date | cat c4t3g0ry;
- - Publicado el 16/12/2014 | Esto es sobre: Unix/Linux Sys.Admin

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.

find [ruta] [expresion_de_bosqueda] [accion]

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:

root@1337 [/h/bucio]$ find  -name index
root@1337 [/h/bucio]$ find  -name index*
./tmp/webalizer/index.html
./tmp/webalizerftp/index.html
./public_html/index.php
root@1337 [/h/bucio]$ find www/ -name index*
www/index.php
root@1337 [/h/bucio]$

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

root@1337 [/h/bucio]$ find www/ -name index*
www/index.php
root@1337 [/h/bucio]$ find www/ -iname index*
www/InDex.PhP
www/index.php

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

root@1337 [/h/bucio]$ find www/ -name "[0-9]*"
www/0ejemplo
root@1337 [/h/bucio]$ find www/ -name "[Oo]*"
www/OtroEjeplo
www/oTroEjemplo
root@1337 [/h/bucio]$ find www/ -name "[b-f]*.txt"
www/ejemplo.txt

Realizar una búsqueda de archivos ocultos:

root@1337 [/h/bucio]$ find www/ -name ".*"
www/.htaccess
www/.oculto.jpg
www/.oculto.php
root@1337 [/h/bucio]$ find www/ -name ".*.php"
www/.oculto.php
root@1337 [/h/bucio]$ find www/ -name ".*.jpg"
www/.oculto.jpg

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

root@1337 [/h/bucio]$ find www/ -user bucio
www/
www/.htaccess
www/index.php
www/cgi-bin
root@1337 [/h/bucio]$ find www/ -user root
www/OtroEjeplo
www/0ejemplo
www/InDex.PhP
www/ejemplo.txt
www/oTroEjemplo
root@1337 [/h/bucio]$ find www/ -user root -perm 777
www/ejemplo.txt

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

root@1337 [/h/bucio]$ find www/ -mmin -20 -type f #Archivos que hayan cambiado en los últimos 20 minutos
www/.oculto.jpg
www/.oculto.php
root@1337 [/h/bucio]$ find www/ -mmin 7 -type f #exactamente hace 07 minutos
www/.oculto.jpg

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.):

find . -mtime 0  #busca archivos modificados entre ahora y hace un día
find . -mtime -1  #busca archivos modificados hace menos de un día
find . -atime 1  #busca archivos accedidos entre hace 24 y 48 horas
find . -ctime +1  #busca archivos cuyo status haya cambiado hace más de 48 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.

root@1337 [/h/bucio]$ find www/ -size 0 -exec ls {} \;
www/OtroEjeplo
www/0ejemplo
www/InDex.PhP
www/ejemplo.txt
www/.oculto.jpg
www/.oculto.php
www/oTroEjemplo

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:

root@1337 [/h/bucio]$ find .filezilla/ -iname '*.xml' -exec cp '{}' /media/USB_delmal \;
root@1337 [/h/bucio]$ }:) 

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:

$> find -name *.html | xargs grep  title *
./index.html:               'a class="lightbox-image" rel="prettyPhoto[2]" href="{{image}}" title="{{title}}"' +
./index.html:                   'img src="{{image_s}}" alt="{{title}}" /' +
>

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

#Por Gunnar Wolf
>$ find . -name '*.html' -exec grep -r title \{\} +
..
#Por GnuGet
>$ grep -Hirn cadena_a_buscar .
#Por Gaspar Fernandez
>$ egrep -R 'loquequierobuscar' *.htm

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?