Entre los comandos básicos tenemos los siguientes: df, ls (y sus variantes), cat, grep, tail, more, less, head, sort, etcétera. Hay un comando que tiene mucho potencial y que nos ayuda en muchas cosas e incluso para ejecutar acciones que queramos sin necesidad de utilizar el Pipe.
Este comando es "find" y su traducción en el español significa "buscar". El comando find es una herramienta muy útil el cual nos permite buscar archivos o carpetas dentro de nuestro Sistema Operativo y que combinado con otras opciones; nos permite expander nuestras utilidades.
La sintaxis para ejecutar este comando es el siguiente:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
Hay mas opciones sobre este comando, en el que podemos consultarlo en nuestro S.O. en cualquier momento de la única manera en que Unix y Linux sabe: Los manuales del comando "man" y lo obtenemos:
$ man find
Debemos entender que todos los comandos siempre presentan opciones que, combinados nos permite obtener diferentes resultados, lo más común para el comando "find" es utilizarlo de la siguiente manera:
$ find /tmp -name archivodeprueba.txt
El resultado que obtendremos es lo siguiente:
/tmp/archivodeprueba.txt
Hasta este punto, el comando nos ha funcionado para realizar una búsqueda sencilla. Si el archivo especificado lo encuentra rápido, obtendremos ese archivo pero el comando find lo único que hizo es buscar en todo lo que sea archivo o directorio y que coincida con el nombre "archivodeprueba.txt" dentro del directorio /tmp. Supongamos que conocemos que lo que estamos buscando es un archivo y queremos agilizar un poco más la búsqueda; lo que tenemos que hacer es complementar nuestro comando de la siguiente manera:
$ find /tmp -name archivodeprueba.txt -type f
con la opción -type podemos especificar el tipo de búsqueda y el comando find soporta los siguientes:
-type c
File is of type c:
b block (buffered) special
c character (unbuffered) special
d directory
p named pipe (FIFO)
f regular file
l symbolic link; this is never true if the -L option or the -follow option is in effect, unless the symbolic link is broken. If you want to search for symbolic links when -L is in effect, use -xtype.
Hasta este punto ya estamos aprendiendo a ser más específicos en nuestra búsqueda, vamos por buen camino, si te interesa más continua leyendo para aprender otras formas de buscar en nuesto S.O. (mucho mejor el comando find que un detective).
Supongamos que ya encontramos el archivo o el directorio (depende lo que busquemos) y queremos hacer algo más con él, algunos copiaríamos el archivo y de ahí con otros comandos haríamos las acciones pertinentes pero que tal si te digo que find puede ejecutar acciones sobre tu búsqueda, eso suena bien y es momento de aprender de qué manera.
con el parámetro "-exec" le indicamos al comando find que ejecute algo sobre lo buscado. Veamos este ejemplo con dicho parámetro:
$ find /tmp -name archivodeprueba.txt -type f -exec ls -lad {} \;
En el ejemplo que pusimos y siguiendo con los ejemplos anteriores sobre nuestro archivo llamado "archivodeprueba.txt", en la opción -exec le estamos indicando que nos muestre el "ls -lad" y es un comando básico que ya debemos de conocer. Los corchetes "{}" son para pasar la salida obtenida de find al comando y "\;" para indicar el término de nuestro comando find:
-rw-r--r-- 1 user apps 3871 Nov 23 20:51 /tmp/archivodeprueba.txt
Si queremos ser más drástico, tal vez podemos combinar todo lo aprendido para borrar aquellos archivos core que se generan por aplicaciones, veamos el ejemplo:
$ find / -name core -type f -exec rm -rf {} \;
Con el ejemplo anterior, estamos indicando al comando find que busque todo los que son "archivos" que tengan el nombre "core" y que los que encuentre, los borre sin preguntar. Incluso podemos explotarlo más si queremos aparte de buscar los archivos, buscar dentro de ellos. La combinación perfecta sería el comando "grep":
$ find /myDomain -name *.xml -type f -exec grep -nH "miprueba.war" {} \;
En el ejemplo anterior estamos indicándole a nuestro comando find que busque en el directorio "/myDomain" los "archivos" que tengan la extensión ".xml" y que posteriormente haga una búsqueda dentro de los archivos que obtenga la cadena "miprueba.war". Al comando grep le pasamos unos parámetros, que la opción "-n" nos va a indicar el número de línea donde encontró la coincidencia de nuestra cadena y la opción "-H" nos va a mostrar el nombre del archivo.
A continuación coloco otras opciones que nos permitirán hacer búsquedas mejores:
-atime n
File was last accessed n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago.
-ctime n
File’s status was last changed n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretation of file status change times.
-mtime n
File’s data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretation of file modification times.
-size n[cwbkMG]
File uses n units of space. The following suffixes can be used:
‘b’ for 512-byte blocks (this is the default if no suffix is used)
‘c’ for bytes
‘w’ for two-byte words
‘k’ for Kilobytes (units of 1024 bytes)
‘M’ for Megabytes (units of 1048576 bytes)
‘G’ for Gigabytes (units of 1073741824 bytes)
The size does not count indirect blocks, but it does count blocks in sparse files that are not actually allocated. Bear in mind that the ‘%k’ and ‘%b’ format specifiers of -printf handle sparse files differently. The ‘b’ suffix always denotes 512-byte blocks and never 1 Kilobyte blocks, which is different to
the behaviour of -ls.
El siguiente ejemplo que pondremos, nos ayudará a buscar archivos que se encuentren en /tmp que tengan más de 1000 caracteres (-size) y no hayan sido accesado en los últimos 30 días (-atime):
$ find /tmp -atime +30 -size +1000c -exec ll -ud {} \;
Hasta aquí terminamos de todo lo que podemos hacer con el comando find, hay muchas otras formas de realizar más búsquedas y sacarle provecho a esas búsquedas. Si tienes dudas puedes dejar tu comentario para orientarte o si tú tienes otras formas de usar el comando "find" te invito a incluirlo en los comandos.
Bytes.