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 /

/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

  • È così ovvio. Perché ' non ci ho pensato ?!
  • In realtà, questo genera un errore 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.

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *