Il peut sembler que je pose la même chose que cette question , mais j'ai des exigences différentes. Voici un exemple de mon système de fichiers:
- /code/
- interne/
- dev /
- principale/
- Publique/
- dev /
- principale/
- Libération/
- outils/
- interne/
/code/internal/dev/
, /code/public/dev/
Et /code/tools/
contenir des sous - répertoires pour plusieurs projets. Je travaille presque exclusivement dans les branches de développement de /code/internal/
et /code/public/
, et souvent je veux rechercher une chaîne de texte dans ces répertoires avec /code/tools/
(qui n'a pas de branches). Dans ces cas, je dois exécuter 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 s'il existe une seule commande pour ce faire. Sinon, j'aurais probablement besoin d'écrire un simple script bash.
grep: /code/internal/dev/*.cs: No such file or directory
sauf si je supprime le*.cs
de la commande. C'est ma faute parce que j'ai posé*.cs
ma question à l'origine.Si vous souhaitez utiliser au maximum les caractères génériques (et que la hiérarchie que vous avez publiée est complète), vous pouvez le faire
Explication:
La première étape effectuée est l'expansion de la liste contreventée.
foo{bar,baz}qux
se développe àfoobarqux foobazqux
. Autrement dit, il y a un mot distinct généré pour chaque élément séparé par des virgules dans la liste, avec la partie préfixe et postfixe attachée à chacun. Vous pouvez voir comment cela fonctionne en faisantqui sort
Notez que cela fonctionne également avec plusieurs accolades et également avec des arguments vides; par exemple
donne
Donc, après l'expansion de l'accolade, votre commande ressemble à ceci:
L'étape suivante est l'expansion des caractères génériques. Vous le savez déjà pour la
*.cs
partie, mais cela fonctionne aussi pour les répertoires intermédiaires; de plus, si a/
suit, seuls les répertoires sont mis en correspondance. Par conséquent, étant donné votre hiérarchie (et la création de noms de.cs
fichiers pour les fichiers), vous obtiendrez la commande:Ce n'est qu'après que tout cela s'est produit,
grep
est appelé avec cette liste d'arguments (notez que la même chose se produit avec vos commandes d'origine;grep
ne voit jamais le*
; l'expansion qui est complètement effectuéebash
avant d'appelergrep
).la source