Grep, find y locate son potentes comandos de Linux que se pueden utilizar para buscar ficheros y directorios. Vamos a intentar explicar cómo utilizar cada uno de estos comandos y las diferencias que los caracterizan.
Índice
Grep, find y locate son potentes comandos de Linux que se pueden utilizar para buscar ficheros y directorios. Vamos a intentar explicar cómo utilizar cada uno de estos comandos y las diferencias que los caracterizan.
Índice
Cada uno de estos comandos funciona de forma diferente, pero todos tienen el mismo objetivo: encontrar fichero y directorios que coincidan con un determinado criterio.
Vamos a analizarlos uno a uno a través de ejemplos. Ya adelanto que el comando find es el más completo y por ello he detallado mucho más su uso.
grep significa Globally Search For Regular Expression and Print out (Búsqueda global de expresiones regulares). Tiene muchas opciones que permiten realizar varias acciones relacionadas con la búsqueda en archivos. En este artículo, observaremos como usar el comando grep con sus opciones disponibles tanto como expresiones regulares básicas para buscar archivos.
Puedes verlo de manera resumida con «grep –help» o la forma extendida con «man grep».
Forma de uso: grep [OPCIÓN]... PATRONES [FICHERO] ... Busca los PATRONES en cada FICHERO. Ejemplo: grep -i «hola mundo» menu.h main.c PATRONES puede contener diversos patrones separados por saltos de linea. Selección e interpretación del patrón: -E, --extended-regexp PATRONS son expressiones regulares ampliadas -F, --fixed-strings PATRONS son conjuntos de cadenas separadas por saltos de linia -G, --basic-regexp PATRONS son expressiones regulares básicas (por defecto) -P, --perl-regexp PATRONS son expressiones regulares de Perl -e, --regexp=PATTERNS use PATTERNS for matching -f, --file=FILE take PATTERNS from FILE -i, --ignore-case ignore case distinctions in patterns and data --no-ignore-case do not ignore case distinctions (default) -w, --word-regexp match only whole words -x, --line-regexp match only whole lines -z, --null-data a data line ends in 0 byte, not newline Miscelánea: -s, --no-messages elimina los mensajes de error -v, --invert-match selecciona las linias que no coincidan -V, --version muestra la información sobre la versión y sal --help muestra esta ayuda y sal Control de salida: -m, --max-count=NUM se para despues de NUM coincidencias -b, --byte-offset muestra el byte de desplazamiento con las lineas de salida -n, --line-number muestra el número de linea con las lineas de salida --line-buffered huelca la salida en cada linea -H, --with-filename muestra el nombre del fichero con las lineas de salida -h, --no-filename elimina los nombre de los ficheros de la salida --label=ETIQUETA utiliza ETIQUETA como prefijo del nombre del fichero para la entrada estandard -o, --only-matching muestra solo la parte de la linea que coincida -q, --quiet, --silent elimina la salida normal --binary-files=TIPUS asume que los ficheros binarios son de tipo TIPUS; TIPUS puede ser «binary», «text» o «without-match» -a, --text equivalente a --binary-files=text -I equivalente a --binary-files=without-match -d, --directories=ACCIÓ como tratar los directorios; ACCIÓN puede ser: «read», «recurse», o «skip» -D, --devices=ACCIÓ como tratar los dispositivos, FIFOs y sòcols; ACCIÓN puede ser: «read» o «skip» -r, --recursive equivalente a --directories=recurse -R, --dereference-recursive igual que la anterior, pero sigue todos los enlaces simbolicos --include=GLOB search only files that match GLOB (a file pattern) --exclude=GLOB skip files that match GLOB --exclude-from=FILE skip files that match any file pattern from FILE --exclude-dir=GLOB skip directories that match GLOB -L, --files-without-match muestra solo los nombres de los FICHEROS que no tengan ninguna linea seleccionada -l, --files-with-matches muestra solo los nombres de los FICHEROS que contengan alguna linea seleccionada -c, --count muestra solo el nombre de lineas selecionadas por FICHERO -T, --initial-tab alinea las tabulaciones (si se necesita) -Z, --null muestra byte 0 después del nombre de FICHERO Control del contexto: -B, --before-context=NOMBRE muestra un NOMBRE de lineas del contexto anterior -A, --after-context=NOMBRE muestra un NOMBRE de lineas del contexto posterior -C, --context=NOMBRE muestra un NOMBRE de lineas del contexto de salida -NUM same as --context=NUM --group-separator=SEP print SEP on line between matches with context --no-group-separator do not print separator for matches with context --color[=WHEN], --colour[=WHEN] use markers to highlight the matching strings; WHEN is 'always', 'never', or 'auto' -U, --binary do not strip CR characters at EOL (MSDOS/Windows) When FILE is '-', read standard input. With no FILE, read '.' if recursive, '-' otherwise. With fewer than two FILEs, assume -h. Exit status is 0 if any line is selected, 1 otherwise; if any error occurs and -q is not given, the exit status is 2. Report bugs to: bug-grep@gnu.org Pagina inicial de GNU grep: <https://www.gnu.org/software/grep/> General help using GNU software: <https://www.gnu.org/gethelp/>
Sin el paso de ninguna opción, grep puede ser usado para buscar un patrón en un archivo o grupo de archivos. La sintaxis es:
grep '<texto-buscado>' <archivo/archivos>
Tenga en cuenta que las comillas simples o dobles son requeridas alrededor del texto si es más de una palabra. Además puedes usar el comodín (*) para seleccionar todos los archivos en un directorio.
El resultado de esto son las ocurrencias del patrón (por la línea en la que se encuentra) en los archivos. Si no existe una coincidencia, no se imprimirá ninguna salida en la terminal.
Imprime las coincidencias de un texto junto con los números de línea. Si observas el resultado anterior, notarás que no se encuentran los números de líneas, solo las coincidencias.
grep you grep.txt -n
Resultado:
1: Hello, how are you 3: Nice to meet you
grep you grep.txt -c
Resultado:
2
Tenga en cuenta si existiera otro «you» en la línea uno, la opción -c aún imprimiría 2. Esto porque está relacionada con el número de líneas donde aparecen las coincidencias, no la cantidad de coincidencias.
grep you grep.txt -v -n
Resultado:
2. I am grep
# comando 1 grep You grep.txt # comando 2 grep YoU grep.txt -i
Resultado:
# resultado 1 # no hay resultados # resultado 2 Hello, how are you Nice to meet you
# comando 1 grep you grep.txt -l # comando 2 grep You grep.txt -i -l
Resultado:
# resultado 1 grep.txt # resultado 2 # todos los archivos en el directorio actual que coincidan # el texto 'You' sea mayúscula o minúscula
Por defecto, grep coincide con cadenas que contienen el patrón especificado. Esto significa que grep yo grep.txt imprimirá los mismos resultados que grep yo grep.txt porque ‘yo’ puede ser encontrado en ‘you’. Similarmente ‘ou’.
Con la opción -w, grep se asegura que las coincidencias sean exactamente el mismo patrón especificado, Ejemplo:
grep yo grep.txt -w
Resultado:
Sin resultados!
Por defecto, grep imprime la línea donde se encuentra el patrón que coincide. Con la opción -o , solo los patrones que coincidan son impresos línea por línea. Ejemplo:
grep yo grep.txt -o
Resultado:
yo
grep grep grep.txt -A 1 -B 1
Resultado:
Hello, how are you I am grep Nice to meet you
Esta coincidencia de patrón se encuentra en la línea 2. -A 1 significa una línea después de la línea que coincide y -B 1 significa una línea antes de la línea que coincide.
Además existe -C (–context) opción el cual es igual a -A + -B. El valor pasado a -C se usaría para -A y -B.
Por defecto, grep no puede buscar directorios. Si tú intentas hacerlo, obtendrás un error («Es un directorio»). Con la opción -R, la búsqueda de archivos entre directorios y subdirectorios se vuelve posible. Ejemplo:
grep you .
Resultado:
# 'you' coincide en carpetas # y archivos a partir del # directorio actual
grep también permite especificar patrones con expresiones regulares básicas. Dos de ellas son:
Este patrón significa que grep solo coincide con cadenas cuyas líneas empiecen con la cadena especificada después ^. Ejemplo:
grep ^I grep.txt -n
Resultado:
2: I
En contraste con ^, $ especifica patrones que coincidirán si la línea termina con la cadena antes $. Ejemplo:
grep you$ grep.txt
Resultado:
1: Hello, how are you 3: Nice to meet you
Otra de las formas para buscar ficheros y directorios en sistemas Linux es utilizando el comando find. El comando Find en Linux es robusto y flexible, ya que permite el uso de argumentos y opciones para filtrar las búsquedas ya sea por fecha, tamaño, tipo, nombre, extensión, permisos, etc. Al ser un comando robusto puede ser difícil de aprender o recordar, pero con los ejemplos que tienes más abajo seguro que puedes empezar con él.
Puedes verlo de manera resumida con «find –help» o la forma extendida con «man find».
Usage: find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression] el camino por defecto es el directorio actual; la expresión por defecto es -print la expresión puede consistir de operadores, opciones, evaluaciones y acciones: operadores (prioridad decreciente; -and es implícito cuando no se dan otros): ( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2 EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2 opciones posicionales (siempre verdaderas): -daystart -follow -regextype opciones normales (siempre verdaderas, especificadas antes otras expresiones): -depth -help -maxdepth NIVELES -mindepth NIVELES -mount -noleaf --version -xdev -ignore_readdir_race -noignore_readdir_race evaluaciones (N puede ser +N o -N o N): -amin N -anewer FICHERO -atime N -cmin N -cnewer FICHERO -ctime N -empty -false -fstype TIPO -gid N -group NOMBRE -ilname PATRÓN -iname PATRÓN -inum N -iwholename PATRÓN -iregex PATRÓN -links N -lname PATRÓN -mmin N -mtime N -name PATRÓN -newer FICHERO -nouser -nogroup -path PATTERN -perm [-/]MODO -regex PATTERN -readable -writable -ejecutable -wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N -used N -user NAME -xtype [bcdpfls] -contexto CONTEXTO actions: -delete -print0 -printf FORMADO -fprintf HILO FORMADO -print -fprint0 HILO -fprint HILO -ls -fls HILO -prune -quit -exec COMMAND ; -exec COMMAND {} + -ok COMMAND ; -execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ; Argumentos válidos para -D: exec, opt, ratas, search, stat, time, tree, ajo, help Uso '-D help' for a description of the options, oro see find(1) Please see also the documentation at https://www.gnu.org/software/findutils/. You can report (and track progress donde fixing) bugs in the "find" program via the GNU findutils bug-*reporting page at https://savannah.gnu.org/bugs/?group=findutils oro, if you have no web access, by sending email tono <bug-findutils@gnu.org>.
Sintaxis genérica:
grep <directory_path> <search_parameter> <search> Ejemplo coloquial: find <directorio donde buscar> -name <busqueda>
Como se puede observar, debemos escribir el comando find seguido de la ruta o directorio donde se va a buscar el archivo o carpeta en Linux, seguidamente deberemos incluir el parámetro de búsqueda y el nombre del archivo o carpeta que deseamos buscar.
Opciones básicas:
Parametro de busqueda | Uso y Explicación |
---|---|
-name | Filtrar por nombre de archivo exacto (distingue entre mayusculas y minusculas) |
-iname | Filtrar por nombre de archivo (no distingue entre mayusculas y minusculas) |
-type | Filtrar por tipo de archivo |
-size, -empty | Filtrar por tamaño de archivo |
-ctime, -mtime, -atime | Filtrar por marca de tiempo |
-user, -group | Filtrar por propietario y grupo |
-perm | Filtrar por derechos de archivo |
Por otra parte, se pueden combinar dichos parámetros de búsqueda con operaciones lógicas «and, or, not», para de esta manera hacer una búsqueda más precisa en Linux. A continuación, te mostraremos una tabla con los operadores lógicos que pueden usarse para combinar los parámetros de búsqueda.
operadores lógicos | Explicación |
---|---|
-and | La búsqueda deben cumplir ambas condiciones |
-or | La búsqueda deben cumplir al menos una de las dos condiciones |
-not | Niega la condición posterior |
Hay que tener en cuenta que esto solo buscara dentro de la carpeta que indiquemos, para buscar en las sub carpetas o subdirectorios debemos usar los parámetros de búsqueda '-name'
y '-iname'
. Por otra parte, si no conoces el nombre exacto del archivo o directorio no te preocupes, puedes utilizar la opción o comodín '*'
de esta manera buscara con Find todos los archivos o directorios que contengan la palabra o extensión buscada.
Con el comando Find podemos especificar en que directorio se debe buscar, por ejemplo, usando la opción «.» buscaremos en el directorio donde este situado el prompt.
find . <search_parameter>
Usando la opción «~» en el directorio home del usuario actual.
find ~ <search_parameter>
Podemos usar el símbolo raíz ‘/’ para buscar en todo el sistema. Si no estás como usuario root no te permitirá realizar búsquedas en todos los directorios protegidos, deberás dar permiso «sudo».
find / <search_parameter>
⚠️ Se debe tener especial cuidado al usar el Linux Find en todo el sistema con el parámetro '-exec'
, ya que esto podría dañar tu sistema operativo.
Al usar el comando de Linux Find los resultados pueden ser muy extensos, para solucionar esto usaremos las utilidades u opciones de la línea de comandos los cuales serán de gran utilidad para ordenar los resultados mostrados con tuberías.
Para mostrar los resultados página a página usaremos el parámetro ‘less’:
find <directory_path> <search_parameter> | less # Ejemplo Practico find ~ -iname Nombre_del_archivo | less
Para conocer el número de resultados, usaremos el comando ‘wc’ Seguido del parámetro ‘-l’:
find <directory_path> <search_parameter> | wc -l # Ejemplo Practico find ~ -iname Nombre_del_archivo | wc -l
En caso de que solo queramos ver los primeros o los últimos resultados de la búsqueda debemos usar los comandos ‘head’ y ‘tail’ seguido del parámetro ‘-n’ y el número de resultados deseados.
find <directory_path> <search_parameter> | head -n <amount> find <directory_path> <search_parameter> | tail -n <amount> # Ejemplo Practico, muestra los primeros 3 resultados de la busqueda find ~ -iname Nombre_del_archivo | head -n 3
Con el parámetro de búsqueda ‘type’ podremos distinguir entre archivos, directorios y enlaces.
Tipo de Archivo | Explicación |
---|---|
f | Archivo |
d | Directorio |
l | Enlace |
Por ejemplo, para filtrar los resultados de la búsqueda y mostrar únicamente los archivos usaremos el parámetro ‘-type’ seguido del tipo de archivo en este caso ‘f’:
find ~ -iname ejemplo.txt -type f
En caso de que necesitemos buscar varios tipos de extensión podemos usar los operadores lógicos mencionados anteriormente. Por ejemplo, en el caso que queramos buscar todos los tipos de archivo con extensión .gif y .jpg:
find ~ -iname *.gif* -or -iname *.jpg* -type f
También podemos usar el comando Find de Linux para buscar y eliminar un archivo de la siguiente forma:
find ~ -name "ejemplo.txt" -delete
Linux crea propiedades de tiempo para los archivos, carpetas o directorios entre ellas podemos encontrar las de marca de tiempo la cuales son:
Usando el comando Find en Linux podemos filtrar y encontrar las marcas de tiempo en las búsquedas para ello utilizaremos ciertos parámetros de búsqueda, los cuales presentaremos a continuación:
Parámetro de búsqueda | Explicación |
---|---|
-ctime, -cmin | Filtrar por fecha de creación |
-mtime, -mmin | Filtrar por fecha de modificación |
-atime, -amin | Filtrar por fecha de acceso |
Por ejemplo, buscar archivos que se cambiaron hace menos 4 días en la carpeta Documentos:
find ~/Documentos -ctime -4
Buscar archivos que se modificaron hace menos 60 minutos en la carpeta Documentos:
find ~/Documentos -mmin -60
Buscar archivos a los que se accedió hace menos de 3 días en la carpeta Documentos:
find ~/Documentos -atime +3
También podemos especificar un rango de días usando los modificadores ‘+’ y ‘-‘.
Si deseamos encontrar archivos creados hace más de 60 días usaremos el parámetro -ctime anidándole el valor numérico ‘100’ anteponiendo el modificador +:
find . -type f -ctime +100
Con el comando Find podemos cubrir rangos específicos en este caso buscaremos archivos que se accedieron entre 10 y 20 días:
find . -type f -atime +10 -and -atime -20
Con el comando find podemos filtrar la búsqueda por el tamaño del archivo utilizando el parámetro ‘-size'
y a continuación un valor numérico que especificara el tamaño deseado.
En el siguiente ejemplo buscaremos archivos con un tamaño mayor a 1 GB:
find . -size +1G
Las unidades disponibles el comando find son las siguientes:
Unidad | Explicación |
---|---|
c | Bytes |
k | Kilobytes |
M | Megabytes |
G | Gigabytes |
b | 512-byte bloques |
Por otra parte, si queremos buscar archivos vacíos con el comando Find utilizaremos el parámetro ‘-empty’ de la siguiente forma:
find . -type f -empty
También se pueden buscar directorios vacíos con el comando Find utilizando el tipo de archivo ‘d’:
find . -type d -empty
A continuación se mostrará una tabla con los parámetros de búsqueda más utilizados:
Parametro | Explicación |
---|---|
-user | Filtra la busqueda por propietario |
-group | Filtra la busqueda por Grupo |
-perm | Filtra la busqueda por permisos o derechos de acceso |
En caso de que deseemos buscar los archivos de nuestro propio usuario o el usuario conectado actualmente utilizaremos el parámetro ‘-user-‘ y la expresión ‘$(whoami)’, dicha expresión tomara el nombre del usuario actual:
find . -user $(whoami)
Si deseamos buscar archivos que son accesibles para todos los usuarios debemos usar el parámetro ‘-perm’ seguido del número octal ‘777’:
find . -perm 777
Generalmente, el comando find en Linux recorrerá todos los directorios y subdirectorios. No obstante, es recomendable limitar la profundidad de la recursividad, es por ello que existen dos parámetros de búsqueda que nos ayudaran a limitar dicha recursividad los cuales son ‘-maxdepth’ y ‘-mindepth’.
Si deseamos encontrar archivos que tengan un tamaño de más de 1 Gigabyte y que solo busque en los directorios que no estén a más de 3 niveles de profundidad del directorio actual, usaremos el siguiente comando:
find . -type f -maxdepth 3 -size +1G
Si deseamos encontrar archivos que tengan un tamaño de más de 1 Gigabyte y que solo busque en los directorios que estén a 3 niveles y no más de 6 niveles de profundidad del directorio actual, usaremos el siguiente comando:
find . -type f -mindepth 3 -and -maxdepth 6 -size +1GB
Es algo muy común que se requiera procesar una gran cantidad de archivos ya sea para modificar sus permisos, repararlos o eliminarlo y en estos casos podremos usar el comando Find para realizar dicha tarea.
A continuación, se mostrará de forma general como usar el comando find y el patrón que se debe usar para ejecutar un comando para cada archivo que se encuentre. No obstante, hay que aclarar que todo comando de este tipo deberá terminar siempre con el texto {} \;:
find -exec {} \;
Si deseamos establecer la propiedad y grupo a uno o todos los archivos y directorios de una ruta en específico usaremos el comando find con el parámetro chown en este caso estableceremos todos los archivos y directorios contenidos en el directorio llamado Carpeta1 a ‘www-data’ de la siguiente manera:
find ~/Documentos/Carpeta1 -maxdepth 1 -exec chown www-data:www-data {} \;
En Linux podemos buscar y cambiar los permisos de un archivo o directorio con el comando Find utilizando el comando chmod. Un ejemplo práctico general sería cambiar los permisos 777 a 664 y lo hacemos de la siguiente manera:
find ~ -type f -maxdepth 1 -perm 777 -exec chmod 664 {} \;
En caso de querer hacerlo con los directorios usaremos el siguiente comando:
find . -type d -maxdepth 1 -exec chmod 755 {} \;
Si deseamos buscar y borrar directorios vacíos con el comando Find usaremos el comando rmdir de la siguiente manera:
find . -type d -maxdepth 1 -empty -ok rmdir {} \;
Por otra parte, si deseamos eliminar todos los archivos vacíos en Linux usaremos el siguiente comando:
find . -type f -maxdepth 1 -empty -ok rm {} \;
Hemos visto que el comando grep es muy adecuado para esto, también lo podemos utilizar con find. Para buscar un texto dentro de un archivo con el comando Find usaremos el comando grep seguido del texto a buscar de la siguiente manera:
find ~ -type f -name "*.txt" -exec grep 'texto-a-buscar' {} \;
En ciertos casos necesitaremos buscar archivos ocultos en el sistema en este caso buscaremos los archivos ocultos en la carpeta de usuario que son aquellos que comienzan por un punto, para ello utilizaremos el siguiente comando:
find $HOME -type f -name ".*"
Con esto hemos concluido con los ejemplos del comando Find. Ha sido más extensa porque de los comandos de búsqueda que mostramos es el más completo.
Una alternativa a utilizar find es el comando locate. A menudo, este comando es más rápido y puede realizar una búsqueda en todo el sistema de archivos con facilidad. Aunque no es tan completo.
Puedes verlo de manera resumida con «locate –help» o la forma extendida con «man locate». Si da error puede que sea porque no tienes el comando instalado.
Usage: plocate [OPTION]... PATTERN... -b, --basename search only the file name portion of path names -c, --count print number of matches instead of the matches -d, --database DBPATH search for files in DBPATH (default is /var/lib/plocate/plocate.db) -i, --ignore-case search case-insensitively -l, --limit LIMIT stop after LIMIT matches -0, --null delimit matches by NUL instead of newline -N, --literal do not quote filenames, even if printing to a tty -r, --regexp interpret patterns as basic regexps (slow) --regex interpret patterns as extended regexps (slow) -w, --wholename search the entire path name (default; see -b) --help print this help --version print version information
Este comando no suele venir en las distros Linux, así que lo tendremos que instalar.
Puede instalar el comando en Debian o Ubuntu con apt:
sudo apt install mlocate
En CentOS, utilice dnf en su lugar:
sudo dnf install mlocate
La razón por la que locate es más rápido que find es porque utiliza una base de datos de los archivos en el sistema de archivos.
Normalmente, la base de datos se actualiza una vez al día con una secuencia de comandos de Cron, pero puede actualizarla de forma manual escribiendo lo siguiente:
sudo updatedb
Ejecute ese comando ahora. Recuerde que la base de datos siempre debe estar actualizada si desea encontrar archivos recientemente adquiridos o creados.
Para encontrar archivos con locate, simplemente utilice la siguiente sintaxis:
locate query
Puede filtrar el resultado de alguna manera.
Por ejemplo, para solo obtener archivos que contengan la consulta en sí, en vez de obtener cada archivo que contenga la consulta en los directorios en que se encuentre, puede utilizar el -b solamente para buscar el “nombre de base”:
locate -b query
Para que con locate solo se obtengan resultados que todavía existen en el sistema de archivos (que no se eliminaron entre la última invocación de updatedb y la invocación actual de locate), utilice el indicador -e:
locate -e query
Para ver estadísticas sobre la información que se catalogó con locate, utilice la opción -S:
locate -S
Output Database /var/lib/mlocate/mlocate.db: 3,315 directories 37,228 files 1,504,439 bytes in file names 594,851 bytes used to store database
grep
, find
y locate
son buenas herramientas para encontrar archivos en su sistema, a cada uno le corresponde decidir cuál usar en cada situación. Debemos contar también que utilizando tuberías podemos hacer estos comandos mucho más potentes. Por ejemplo, se puede probar con wc
, sort
y grep
😊