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

  • Es bueno incluir la nota de la versión. Con BSD grep produce: grep: warning: recursive search of stdin

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 con grep -r foo * es que el shell glob * no ' t expandir para incluir directorios / archivos ocultos, a menos que dotglob se haya configurado con shopt -s dotglob. Pruebe con grep -r foo . y tú ' Veré que los directorios ocultos son recorridos por grep. O intente con shopt -s dotglob y luego grep -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

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" {} \+ 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *