Il peut sembler que je « pose la même chose que cette question , mais Jai des exigences différentes. Voici un exemple de mon système de fichiers:

  • / code /
    • internal /
      • dev /
      • main /
    • public /
      • dev /
      • main /
      • release /
    • outils /

/code/internal/dev/, /code/public/dev/ et /code/tools/ contiennent des sous-répertoires pour plusieurs projets. Je travaille presque exclusivement dans les branches de développement de /code/internal/ et /code/public/, et je souhaite souvent rechercher une chaîne de texte dans ces répertoires avec /code/tools/ (qui na pas de branches). Dans ces cas, je dois faire trois commandes distinctes:

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

Je « voudrais savoir sil existe » une seule commande pour le faire. Sinon, jaurais probablement besoin décrire un script bash simple.

A nswer

Vous pouvez concaténer plusieurs chemins pour que grep recherche:

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

Commentaires

  • Cest tellement évident. Pourquoi nai-je pas ' penser à ça?!
  • En fait, cela génère une erreur grep: /code/internal/dev/*.cs: No such file or directory sauf si je supprime le *.cs de la commande. Cest de ma faute car jai mis le *.cs dans ma question à lorigine.

Réponse

Si vous voulez utiliser au maximum les caractères génériques (et que la hiérarchie que vous avez publiée est complète), vous pouvez faire

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

Explication:

La première étape est le développement de la liste entre parenthèses. foo{bar,baz}qux se développe en foobarqux foobazqux. Autrement dit, « un mot séparé est généré pour chaque élément séparé par des virgules dans la liste, avec le préfixe et le suffixe attachés à chacun. Vous pouvez voir comment cela fonctionne en faisant

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

qui affiche

A1B A2B A3B A4B 

Notez que cela fonctionne également avec plusieurs accolades, et aussi avec des arguments vides; par exemple

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

donne

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 

Donc, après le développement daccolades, votre commande ressemble à ceci:

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

La prochaine étape est lexpansion des caractères génériques. Vous le savez déjà pour la partie *.cs, mais cela fonctionne aussi pour les répertoires intermédiaires; de plus, si un / suit, seuls les répertoires sont mis en correspondance. Par conséquent, étant donné votre hiérarchie (et la composition des noms de fichiers pour les fichiers .cs), vous  » ll obtiendra la commande:

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 

Ce nest quaprès que tout cela sest produit, grep est appelé avec cette liste darguments uments (notez que la même chose se produit avec vos commandes dorigine; grep ne voit jamais les *; lexpansion qui est entièrement effectuée par bash avant dappeler grep).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *