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 /
- internal /
/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
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
).
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.