Es hört sich vielleicht so an, als würde ich das Gleiche fragen wie diese Frage , aber Ich habe unterschiedliche Anforderungen. Dies ist ein Beispiel für mein Dateisystem:

  • / code /
    • intern /
      • dev /
      • main /
    • public /
      • dev /
      • main /
      • release /
    • tools /

/code/internal/dev/, /code/public/dev/ und /code/tools/ enthalten Unterverzeichnisse für mehrere Projekte. Ich arbeite fast ausschließlich in den Entwicklungszweigen von /code/internal/ und /code/public/, und oft möchte ich in diesen Verzeichnissen nach einer Textzeichenfolge suchen, zusammen mit /code/tools/ (das keine Verzweigungen hat). In diesen Fällen muss ich tun drei separate Befehle:

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

Ich möchte wissen, ob es einen einzigen Befehl gibt, um dies zu tun. Wenn nicht, müsste ich höchstwahrscheinlich einen schreiben einfaches Bash-Skript.

A. nswer

Sie können mehrere Pfade verketten, nach denen grep suchen soll:

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

Kommentare

  • Das ist so offensichtlich. Warum habe ich nicht ' daran gedacht?!
  • Dies führt tatsächlich zu einem Fehler grep: /code/internal/dev/*.cs: No such file or directory, es sei denn, ich entferne das *.cs aus dem Befehl. Dies ist meine Schuld, weil ich ursprünglich die *.cs in meine Frage eingefügt habe.

Antwort

Wenn Sie Platzhalter maximal nutzen möchten (und die von Ihnen veröffentlichte Hierarchie vollständig ist), können Sie

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

Erläuterung:

Der erste Schritt ist die Erweiterung der geschweiften Liste. foo{bar,baz}qux wird zu foobarqux foobazqux erweitert. Das heißt, für jedes durch Kommas getrennte Element in der Liste wird ein separates Wort generiert, an das jeweils der Präfix- und Postfix-Teil angehängt ist. Sie können sehen, wie dies funktioniert, indem Sie

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

gibt

A1B A2B A3B A4B 

aus. Beachten Sie, dass dies auch mit mehreren geschweiften Klammern und auch mit leeren Argumenten funktioniert, z. B.

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

gibt

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 

Nach der Erweiterung der Klammer sieht Ihr Befehl also folgendermaßen aus:

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

Der nächste Schritt ist die Platzhaltererweiterung. Das wissen Sie bereits für den Teil *.cs, aber es funktioniert auch für Zwischenverzeichnisse. Wenn eine / folgt, werden nur Verzeichnisse abgeglichen. Geben Sie daher Ihre Hierarchie an (und bilden Sie Dateinamen für die .cs -Dateien), Sie “ Ich erhalte den folgenden Befehl:

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 

Erst nachdem dies alles geschehen ist, wird grep mit dieser Liste von Argumenten aufgerufen uments (beachten Sie, dass dies auch bei Ihren ursprünglichen Befehlen der Fall ist; grep sieht die * nie; Das Erweitern erfolgt vollständig durch bash, bevor grep) aufgerufen wird.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.