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:
- «[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
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:
- +n busca valores mayor que n
- -n busca valores menor que n
- n busca exactamente el valor n
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:
#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?