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