Quiero buscar una cadena de texto en todos los archivos en un directorio (y no en sus subdirectorios; sé que la -ropción lo hace, pero eso no es lo que quiero).
Corriendo
grep "string" /path/to/dirse supone que es capaz de hacer esto, lo he leído, pero me da el error:
grep: dir: es un directorio
A continuación, intenté ejecutar
grepen varios archivos.grep "string" .bashrc .bash_aliasesfunciona perfectamente.grep "string" .bash*Funciona según lo previsto también.grep "string" *me da los errores:grep: data: Is a directory grep: Desktop: Is a directory grep: Documents: Is a directory grep: Downloads: Is a directory ...
Solo se imprimen los errores, no obtengo las líneas coincidentes. Intenté usar la -sopción, pero fue en vano.
Entonces, mis preguntas:
¿Por qué no puedo usar
grepen un directorio, como en (1), cuando debería poder? Lo he visto en muchos ejemplos en Internet.
Editar : cuando digo "usar grep en un directorio", me refiero a "buscar en todos los archivos de ese directorio, excepto sus subdirectorios". Creo que esto es lo que hace grep cuando le pasa un directorio en lugar de un archivo. ¿Soy incorrecto?Por favor, dame una explicación sobre el funcionamiento de
grepeso explicaría el comportamiento de los comandos en (2).
Editar : Déjame ser más específico. ¿Por qué el uso de comodines para especificar múltiples archivos para buscar trabajo.bash*y no con*o incluso./*?¿Cómo puedo buscar todos los archivos en un directorio (y no en sus subdirectorios) usando
grep?

*, conocido como globbing. Globbing no incluye nombres de archivo que comienzan con un punto.bashrccomo el estándar. Puede establecer opciones de shell para que incluya estos archivos, pero puede meterse en un lío si no sabe lo que está haciendo. Puede encontrar una buena guía para comprender el gloging aquí mywiki.wooledge.org/globgrep "string" .bash*.grep "string" * .* 2>/dev/nullogrep -s "string" * .*Respuestas:
En Bash, un globo no se expandirá a archivos ocultos, por lo que si desea buscar todos los archivos en un directorio, debe especificar los archivos ocultos
.*y no ocultos*.Para evitar los errores "Es un directorio", puede usar
-d skip, pero en mi sistema también recibo un errorgrep: .gvfs: Permission denied† , por lo que sugiero usar-s, que oculta todos los mensajes de error.Entonces, el comando que está buscando es:
Si está buscando archivos en otro directorio:
Otra opción es usar la
dotglobopción de shell, que hará que un globo incluya archivos ocultos.Para archivos en otro directorio:
† Alguien mencionó que no debería recibir este error. Puede que tengan razón: leí un poco pero no pude entenderlo.
fuente
*y.*?echo * .*yecho *.*ejecute en su directorio de inicio, y la diferencia debería ser obvia. De lo contrario, LMK y lo explicaré.echo *muestra archivos y carpetasecho *.*no ocultos,echo .*muestra archivos no ocultos, muestra todos los archivos yecho * .*muestra todos los archivos y directorios. Pero, ¿por qué la razón del espacio entre los dos en el último caso? Se siente desordenado para mí. ¿No hay una forma de combinar los dos para obtener los mismos resultados? O de lo contrario, ¿hay una explicación de la sintaxis de por qué los dos deben separarse aquí, o es* .*un caso excepcional?*representa todos los archivos no ocultos (es decir, nombres de archivo que no comienzan con un punto);.*representa todos los archivos ocultos (es decir, nombres de archivo que no empiezan por un punto); y*.*representa todos los archivos no ocultos que contienen un punto. Enecho * .*, los dos globos deben estar separados porque son globos diferentes: uno para no oculto, uno para oculto. Aunque, como escribí en mi respuesta, puede*incluir archivos ocultos activando ladotglobopción de shell.*.*es común en Windows (DOS) como una forma de listar todos los archivos, pero en * nix solo incluirá archivos con un punto, por lo que no tiene sentido en * nix. En su lugar, utiliza*para enumerar todos los archivos, excepto los archivos ocultos, y.*para enumerar los archivos ocultos.Necesita la
-d skipopción agregada.Grep está buscando dentro de los archivos. Puede buscar de forma recursiva, como dijo, si desea buscar archivos dentro de un directorio.
Por defecto, grep leerá todos los archivos y detectará los directorios. Debido a que, de manera predeterminada, no ha definido qué hacer con los directorios con la
-dopción, da un resultado de error.Buscar solo dentro del directorio padre sería `grep -d skip" string "./*
fuente
man grep.-d skipno funciona; es básicamente lo mismo que-s; También, vea la edición. (c) No,grep -d skip "string" ./*tampoco funciona.Los veteranos probablemente harían esto:
fuente
find . -type f -exec grep string {} +?-maxdepth 1.find . -type f -maxdepth 1 -exec grep string /dev/null {} +-Ha grep.Reformulación: ¿desea grep los archivos en un nivel de subdirectorio, pero no recurrir a través de todos los subdirectorios?
O si no quieres los archivos en el directorio actual
Tenga en cuenta que esto no encontrará directorios que comiencen con un punto.
Debería hacer ese trabajo.
También hay
-maxdepthy-mindepthparámetros disponibles restricción alfindcomando también.fuente
grep forthis */*buscaría archivos tanto en el directorio actual como en uno abajo?*/*solo combina cosas con una barra. Si tuviera un archivo nombradoa/ben el directorio actual, entonces '* / * coincidiría con eso.Aquí hay un ejemplo para omitir directorios sin omitir todos los errores:
fuente