grep es una herramienta de Linux que se utiliza habitualmente para buscar archivos de texto para contenido específico. Sin embargo, suele ser útil buscar en directorios nombres de archivos en lugar de contenidos, y esto se puede hacer con grep y otras utilidades de línea de comandos de Linux.
Usando buscar en lugar de grep
La utilidad grep esencialmente toma entradas de cadenas de archivos o entradas estándar y usa patrones o Regex para buscarlas e imprimir líneas coincidentes.
Técnicamente, puedes usar grep por sí solo para buscar nombres de archivos en lugar de contenido, pero es solo porque Linux permite comodines en las entradas de nombres de archivos. Sin embargo, puedes utilizar con la misma facilidad
ls
enumerar archivos de esta manera, o usar comodines en cualquier otro comando, y no es una solución real para buscar nombres de archivos como grep busca contenido.
grep "" ./file* -l
La verdadera solución es utilizar la utilidad de búsqueda, que puede buscar en subdirectorios y proporciona la forma más resistente de buscar archivos, ya que interactúa directamente con el sistema de archivos. Esta es la utilidad más utilizada para buscar en directorios y tiene muchas opciones, incluida la coincidencia de patrones y la compatibilidad con Regex.
El uso más básico es utilizar find por sí solo para imprimir una lista de archivos, incluidos subdirectorios, y enviar esa entrada a grep. Si ya tiene scripts que usan grep, será bastante fácil convertirlos para que coincidan de esta manera.
find | grep "file"
También puedes usar patrones directamente con find, eliminando la necesidad de grep. Utilice -iname con una entrada.
find . -iname 'file_*.txt'
Sin embargo, a diferencia de grep, el comando de búsqueda es un poco más estricto: debe usar comillas simples o dobles para escapar de la cadena de búsqueda y debe usar comodines para hacer coincidir toda la cadena. No es posible simplemente encontrar una subcadena en el nombre sin utilizar comodines para que coincida con el resto del nombre.
Usando expresiones regulares (Regex) con buscar
También puedes usar expresiones regulares con buscar, lo que permite una coincidencia mucho más avanzada:
find . -regex './file.*'
Esta expresión regular coincidirá con todos los archivos en el directorio actual que comiencen con «archivo». Sin embargo, es importante tener en cuenta que esto funciona de manera diferente a -iname; la entrada incluye la ruta completa del directorio y debe usar ./ para escapar de la ruta relativa, ./.
Este comando que se muestra aquí excluye la carpeta ./subdirectory/, porque no comienza con «archivo». Para solucionar este problema, debes hacer coincidir todo lo que conduce a la barra diagonal final con .*/:
find . -regex '.*/file.*'
Las expresiones regulares son muy complicadas, pero muy poderosas. Si desea obtener más información, puede leer nuestra guía sobre cómo funcionan.