Siguiendo el consejo de esta pregunta, puedo hacer grep de forma recursiva para una cadena string
dentro del contenido de un directorio determinado dir
de la siguiente manera
grep -r --exclude-dir=".*" string dir
Sin embargo, cuando aplico esto al directorio actual, como
$ grep -r --exclude-dir=".*" string . $
No obtengo resultados, ya que --exclude-dir=".*"
omite el directorio actual como oculto ya que coincide con ".*"
.
Una solución alternativa es cambiar al directorio principal a través de cd ..
, luego ejecute el comando en el niño apropiado, luego cd
nuevamente en ese directorio de trabajo original. Debe haber un comando único que pueda usar para hacer esto sin tener que cambiar de directorio.
¿Qué es un comando único para grep contenido? del directorio actual, omitiendo el contenido de los directorios ocultos?
Responder
Si está utilizando GNU grep 2.11 o posterior, -r
comenzará desde el directorio actual si no se especifica ningún directorio:
grep -r --exclude-dir=".*" string
Comentarios
Respuesta
En shell glob (también conocido como patrones de nombre de archivo), .
no tiene un significado especial, *
significa cero o más caracteres, y ?
significa cualquier carácter individual.
Lo que desea excluir es un punto seguido de al menos un carácter, y luego cualquier número de caracteres. Por lo tanto, use:
grep -r --exclude-dir=".?*" string .
Responder
Desde bash
no tendrá grep
atravesar directorios ocultos de forma predeterminada (es decir, sin dotglob
habilitado:
$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo
Simplemente excluya los archivos ocultos:
$ grep --exclude=".*" -r foo * file:foo test/file:foo
Comentarios
- Tengo curiosidad por conocer el razonamiento detrás del voto negativo sin comentarios.
- No ' t voto negativo, pero ' no es cierto que
grep
no ' t atraviesa directorios ocultos. Lo que ' Lo que veo congrep -r foo *
es que el shell glob*
no ' t expandir para incluir directorios / archivos ocultos, a menos quedotglob
se haya configurado conshopt -s dotglob
. Pruebe congrep -r foo .
y tú ' Veré que los directorios ocultos son recorridos por grep. O intente conshopt -s dotglob
y luegogrep -r foo *
. - Punto justo; He aclarado esto en mi respuesta.
- Esto aún buscará archivos en directorios ocultos contenidos dentro de los argumentos de la línea de comando. Funcionará en cierto modo . En la mayoría de los casos, podría estar bien, pero ' es como definir " pi " como " 3.1416 "; es mejor que conozca las advertencias.
Respuesta
También puede especificar el directorio actual usando $(pwd)
como:
grep -r --exclude-dir=".*" string "$(pwd)"
Comentarios
- Cite su sustitución de comando:
"$(pwd)"
Consulte también ¿Por qué mi script de shell se ahoga con espacios en blanco u otros caracteres especiales?
Responder
Para recurrir dentro de un único directorio (sin limitar los archivos ocultos de subdirectorios) use:
Como echo dir/*
imprimirá todos los archivos dentro de dir, esto funcionará para archivos dentro de algún directorio:
$ grep -r "string" $(echo dir/*)
simplemente cambie dir
a .
(punto) y obtendrá exactamente lo que desea:
$ grep -r "string" $(echo ./*)
Si lo que se necesita son archivos ocultos en ninguno de los subdirectorios, utilice:
$ grep -r --exclude-dir=".*" "string"
O use buscar:
find . -not -path "*/\.*" -type f -exec grep "string" {} \+
grep
produce:grep: warning: recursive search of stdin