[+] 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:

[email protected] [/h/bucio]$ find  -name index
[email protected] [/h/bucio]$ find  -name index*
./tmp/webalizer/index.html
./tmp/webalizerftp/index.html
./public_html/index.php
[email protected] [/h/bucio]$ find www/ -name index*
www/index.php
[email protected] [/h/bucio]$

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

[email protected] [/h/bucio]$ find www/ -name index*
www/index.php
[email protected] [/h/bucio]$ find www/ -iname index*
www/InDex.PhP
www/index.php

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

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

Realizar una búsqueda de archivos ocultos:

[email protected] [/h/bucio]$ find www/ -name ".*"
www/.htaccess
www/.oculto.jpg
www/.oculto.php
[email protected] [/h/bucio]$ find www/ -name ".*.php"
www/.oculto.php
[email protected] [/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:

[email protected] [/h/bucio]$ find www/ -user bucio
www/
www/.htaccess
www/index.php
www/cgi-bin
[email protected] [/h/bucio]$ find www/ -user root
www/OtroEjeplo
www/0ejemplo
www/InDex.PhP
www/ejemplo.txt
www/oTroEjemplo
[email protected] [/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:

[email protected] [/h/bucio]$ find www/ -mmin -20 -type f #Archivos que hayan cambiado en los últimos 20 minutos
www/.oculto.jpg
www/.oculto.php
[email protected] [/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.

[email protected] [/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:

[email protected] [/h/bucio]$ find .filezilla/ -iname '*.xml' -exec cp '{}' /media/USB_delmal \;
[email protected] [/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?