Es hört sich vielleicht so an, als würde ich das Gleiche wie diese Frage stellen , aber ich habe andere Anforderungen. Dies ist ein Beispiel für mein Dateisystem:
- /Code/
- intern /
- dev /
- Main/
- Öffentlichkeit/
- dev /
- Main/
- Freisetzung/
- Werkzeuge/
- intern /
/code/internal/dev/
, /code/public/dev/
Und /code/tools/
Verzeichnisse für mehrere Projekte enthalten. Ich arbeite fast ausschließlich in den dev-Zweigen von /code/internal/
und /code/public/
und möchte oft nach einer Textzeichenfolge in diesen Verzeichnissen zusammen mit suchen /code/tools/
(die keine Zweige hat). In diesen Fällen muss ich drei separate Befehle ausführen:
$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/
Ich würde gerne wissen, ob es dafür einen einzigen Befehl gibt. Wenn nicht, müsste ich höchstwahrscheinlich ein einfaches Bash-Skript schreiben.
grep: /code/internal/dev/*.cs: No such file or directory
sei denn, ich entferne den*.cs
aus dem Befehl. Das ist mein Fehler, weil ich das*.cs
ursprünglich in meine Frage gestellt habe.Wenn Sie die Platzhalter maximal nutzen möchten (und die von Ihnen bereitgestellte Hierarchie vollständig ist), können Sie dies tun
Erläuterung:
Der erste Schritt ist die Erweiterung der Klammerliste.
foo{bar,baz}qux
erweitert umfoobarqux foobazqux
. Das heißt, für jedes durch Kommas getrennte Element in der Liste wird ein separates Wort generiert, an das jeweils das Präfix und das Postfix angehängt sind. Sie können sehen, wie das funktioniertwelche Ausgänge
Beachten Sie, dass dies auch mit mehreren geschweiften Klammern und auch mit leeren Argumenten funktioniert. beispielsweise
gibt
Nach der Klammererweiterung sieht Ihr Befehl also folgendermaßen aus:
Der nächste Schritt ist die Platzhaltererweiterung. Sie wissen das bereits für das
*.cs
Teil, aber es funktioniert auch für Zwischenverzeichnisse; Außerdem werden, wenn/
folgt, nur Verzeichnisse abgeglichen. In Anbetracht Ihrer Hierarchie (und der Dateinamen für die.cs
Dateien) erhalten Sie daher den Befehl:Erst nachdem all dies geschehen ist,
grep
wird mit dieser Liste von Argumenten aufgerufen (beachte, dass dasselbe mit deinen ursprünglichen Befehlen passiert ; bekomme dasgrep
nie zu sehen*
; Erweiterung, die vollständig vonbash
vor dem Aufruf durchgeführt wirdgrep
).quelle