Come posso usare grep per cercare più directory non desiderate?


21

Può sembrare che sto facendo la stessa cosa di questa domanda , ma ho requisiti diversi. Questo è un esempio del mio filesystem:

  • /codice/
    • interno/
      • dev /
      • principale/
    • pubblico/
      • dev /
      • principale/
      • pubblicazione/
    • utensili/

/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 voglio cercare una stringa di testo in quelle directory insieme /code/tools/(che non ha rami). In questi casi, devo eseguire tre comandi separati:

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

Mi piacerebbe sapere se c'è un solo comando per farlo. Altrimenti, molto probabilmente avrei bisogno di scrivere un semplice script bash.

Risposte:


38

Puoi concatenare diversi percorsi che grep deve cercare:

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

Questo è così ovvio. Perché non ci ho pensato ?!
David Kennedy,

In realtà, questo genera un errore a grep: /code/internal/dev/*.cs: No such file or directorymeno che non rimuova il *.csdal comando. Questa è colpa mia perché ho inserito la *.csmia domanda in origine.
David Kennedy,

14

Se vuoi sfruttare 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 fatto è l'espansione dell'elenco controvento. foo{bar,baz}quxsi espande a foobarqux foobazqux. Cioè, c'è una parola separata generata per ogni elemento separato da virgole nell'elenco, con il prefisso e la parte postfisso collegati a ciascuno. Puoi vedere come funziona facendo

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

quali uscite

A1B A2B A3B A4B

Si noti che questo funziona anche con più parentesi graffe e anche con argomenti vuoti; per esempio

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

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 l'espansione del controvento, il tuo comando è simile al seguente:

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

Il prossimo passo è l'espansione dei caratteri jolly. Lo sai già per la *.csparte, ma funziona anche per le directory intermedie; inoltre, se /segue, vengono abbinate solo le directory. Pertanto data la tua gerarchia (e inventando i nomi dei file per i .csfile), otterrai 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, grepviene chiamato con questo elenco di argomenti (nota che lo stesso accade con i tuoi comandi originali; grepnon riesci mai a vedere il *; espandere ciò che è completamente fatto bashprima di chiamare grep).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.