Puede parecer que estoy haciendo lo mismo que esta pregunta , pero tengo requisitos diferentes. Este es un ejemplo de mi sistema de archivos:
- /código/
- interno/
- dev /
- principal/
- público/
- dev /
- principal/
- lanzamiento/
- herramientas/
- interno/
/code/internal/dev/
, /code/public/dev/
Y /code/tools/
contener 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 necesite escribir un script bash simple.
grep: /code/internal/dev/*.cs: No such file or directory
menos que elimine*.cs
el comando. Esto es mi culpa porque puse el*.cs
en mi pregunta originalmente.Si desea aprovechar al máximo los comodines (y la jerarquía que publicó está completa), puede hacerlo
Explicación:
El primer paso realizado es la expansión de la lista de llaves.
foo{bar,baz}qux
se expande afoobarqux foobazqux
. Es decir, se genera una palabra separada para cada elemento separado por comas en la lista, con el prefijo y la parte de postfix adjunta a cada uno. Puedes ver cómo funciona haciendoque salidas
Tenga en cuenta que esto también funciona con llaves múltiples, y también con argumentos vacíos; por ejemplo
da
Entonces, después de la expansión de llaves, su comando se ve así:
El siguiente paso es la expansión de comodines. Ya lo sabe para la
*.cs
parte, pero también funciona para directorios intermedios; además, si a/
sigue, solo los directorios coinciden. Por lo tanto, dada su jerarquía (y la composición de los nombres de los.cs
archivos), obtendrá el comando:Solo después de que todo esto haya sucedido,
grep
se llama con esta lista de argumentos (tenga en cuenta que lo mismo sucede con sus comandos originales;grep
nunca llega a ver el*
; la expansión se realiza completamentebash
antes de llamargrep
).fuente