Può sembrare che “stia chiedendo la stessa cosa di questa domanda , ma Ho requisiti diversi. Questo è un esempio del mio filesystem:
- / code /
- internal /
- dev /
- main /
- public /
- dev /
- main /
- release /
- strumenti /
- internal /
/code/internal/dev/
, /code/public/dev/
e /code/tools/
contengono sottodirectory per più progetti. Lavoro quasi esclusivamente nei rami dev di /code/internal/
e /code/public/
e spesso desidero cercare una stringa di testo in quelle directory insieme a /code/tools/
(che non ha diramazioni). In questi casi devo fare tre comandi separati:
$ grep -r "some string" /code/internal/dev/ $ grep -r "some string" /code/public/dev/ $ grep -r "some string" /code/tools/
Vorrei “sapere se esiste” un unico comando per farlo. In caso contrario, molto probabilmente dovrei scrivere un semplice script bash.
A nswer
Puoi concatenare diversi percorsi che grep deve cercare:
grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/
Commenti
Risposta
Se desideri utilizzare al massimo i caratteri jolly (e la gerarchia che hai pubblicato è completa), puoi farlo
grep -r "some string" /code/{*/dev,tools}/*.cs
Spiegazione:
Il primo passo è lespansione dellelenco tra parentesi graffe. foo{bar,baz}qux
si espande in foobarqux foobazqux
. Cioè, cè una parola separata generata per ogni elemento separato da virgole nellelenco, con la parte del prefisso e del suffisso allegato a ciascuno. Puoi vedere come funziona facendo
echo A{1,2,3,4}B
che restituisce
A1B A2B A3B A4B
Nota che funziona anche con più parentesi graffe e anche con argomenti vuoti; ad esempio
echo {,1,2}{0,1,2}:{2,3}
restituisce
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
Quindi, dopo lespansione delle parentesi graffe, il tuo comando ha questo aspetto:
grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs
Il passaggio successivo è lespansione con caratteri jolly. Lo sai già per la parte *.cs
, ma funziona anche per directory intermedie; inoltre, se segue un /
, vengono trovate solo le directory. Pertanto, data la tua gerarchia (e la creazione di nomi di file per i file .cs
), tu ” riceverò il 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 dopo che tutto ciò è accaduto, grep
viene chiamato con questo elenco di argomenti uments (nota che lo stesso accade con i tuoi comandi originali; grep
non riesce mai a vedere il *
; espansione che viene eseguita completamente da bash
prima di chiamare grep
).
grep: /code/internal/dev/*.cs: No such file or directory
a meno che non rimuova il*.cs
dal comando. È colpa mia perché inizialmente ho inserito*.cs
nella mia domanda.