Quiero buscar una cadena de texto en todos los archivos en un directorio (y no en sus subdirectorios; sé que la -r
opción lo hace, pero eso no es lo que quiero).
Corriendo
grep "string" /path/to/dir
se 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
grep
en varios archivos.grep "string" .bashrc .bash_aliases
funciona 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 -s
opción, pero fue en vano.
Entonces, mis preguntas:
¿Por qué no puedo usar
grep
en 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
grep
eso 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.bashrc
como 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/null
ogrep -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
dotglob
opció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 ladotglob
opció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 skip
opció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
-d
opción, da un resultado de error.Buscar solo dentro del directorio padre sería `grep -d skip" string "./*
fuente
man grep
.-d skip
no 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 {} +
-H
a 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
-maxdepth
y-mindepth
parámetros disponibles restricción alfind
comando 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/b
en el directorio actual, entonces '* / * coincidiría con eso.Aquí hay un ejemplo para omitir directorios sin omitir todos los errores:
fuente