Puede parecer que «estoy preguntando lo mismo que esta pregunta , pero Tengo diferentes requisitos. Este es un ejemplo de mi sistema de archivos:

  • / code /
    • internal /
      • dev /
      • main /
    • public /
      • dev /
      • main /
      • release /
    • herramientas /

/code/internal/dev/, /code/public/dev/ y /code/tools/ contienen subdirectorios para varios proyectos. Trabajo casi exclusivamente en las ramas de desarrollo de /code/internal/ y /code/public/, y a menudo quiero buscar una cadena de texto en esos directorios junto con /code/tools/ (que no tiene ramas). En estos casos, tengo que hacer tres comandos separados:

$ grep -r "some string" /code/internal/dev/ $ grep -r "some string" /code/public/dev/ $ grep -r "some string" /code/tools/ 

Me gustaría saber si hay un solo comando para hacer esto. De lo contrario, lo más probable es que deba escribir un script bash simple.

A nswer

Puede concatenar varias rutas para que grep las busque:

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/ 

Comentarios

  • Esto es tan obvio. ¿Por qué ' no pensé en esto?
  • En realidad, esto arroja un error grep: /code/internal/dev/*.cs: No such file or directory a menos que elimine el *.cs desde el comando. Esto es culpa mía porque puse *.cs en mi pregunta originalmente.

Respuesta

Si desea aprovechar al máximo los comodines (y la jerarquía que publicó está completa), puede hacerlo

grep -r "some string" /code/{*/dev,tools}/*.cs 

Explicación:

El primer paso que se realiza es la expansión de la lista entre llaves. foo{bar,baz}qux se expande a foobarqux foobazqux. Es decir, se genera una palabra separada para cada elemento de la lista separado por comas, con el prefijo y el sufijo adjuntos a cada uno. Puede ver cómo funciona haciendo

echo A{1,2,3,4}B 

que genera

A1B A2B A3B A4B 

Tenga en cuenta que esto también funciona con varias llaves y también con argumentos vacíos; por ejemplo

echo {,1,2}{0,1,2}:{2,3} 

da

0:2 0:3 1:2 1:3 2:2 2:3 10:2 10:3 11:2 11:3 12:2 12:3 20:2 20:3 21:2 21:3 22:2 22:3 

Entonces, después de la expansión de llaves, su comando se ve así:

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs 

El siguiente paso es la expansión de comodines. Ya lo sabes para la parte *.cs, pero también funciona para directorios intermedios; además, si le sigue un /, solo los directorios coinciden. Por lo tanto, dada su jerarquía (y creando nombres de archivo para los archivos .cs), usted » Obtendré el comando:

grep -r "some string" /code/internal/dev/file1.cs /code/internal/dev/file2.cs /code/public/dev/file3.cs /code/tools/file4.cs /code/tools/file5.cs 

Solo después de que todo esto haya sucedido, se llama a grep con esta lista de argumentos uments (tenga en cuenta que lo mismo sucede con sus comandos originales; grep nunca llega a ver el *; expandir que se realiza completamente con bash antes de llamar a grep).

Deja una respuesta

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