Suchen von Unterverzeichnissen in allen Verzeichnissen mit demselben Namen

8

Ich möchte einen Befehl ausführen, um:

  1. Suchen Sie alle Verzeichnisse mit dem Namen " inc" unter einem Ordner " X".
  2. Listen Sie alle Unterverzeichnisse unter jedem " X/.../inc/" auf.
  3. Leiten Sie die Ausgabe in eine Datei mit dem Namen " list" um

Ich habe verschiedene Kombinationen des folgenden Befehls ohne Erfolg ausprobiert:

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

Wie kann ich das machen?

iammilind
quelle

Antworten:

13

find kann das alles alleine machen:

find X -path '*/inc/*' -type d > list

Lesen Sie den -pathTeil von man findfür weitere Informationen.

Wie ich in einem Kommentar schnell erwähnt habe: Wenn Sie die Verzeichniszeile getrennt in einer Textdatei speichern, sind Verzeichnisnamen mit Zeilenumbrüchen nicht eindeutig darstellbar. Wenn Sie sicher sind , dass Verzeichnisse keine Zeilenumbrüche enthalten, ist dies in Ordnung. Nur eine allgemeine Bemerkung.

Daniel Andersson
quelle
ja. Ich gab die gleiche Antwort hier
Prinz John Wesley
Oder finden Sie X-Name 'inc' -Typ d> Liste
MaQleod
@ MaQleod: Nein, das ist nicht die Frage.
Daniel Andersson
4

Hier ist ein praktischer Einzeiler:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

Es läuft findauf jedem der ersten findErgebnisse. Die execOption kann auch einen minimalen Shell-Befehl annehmen, bei dem - wie gesagt - {}jedes Verzeichnis des ersten ersetzt wird find.

Das zweite findwird gemäß Ihrer Anfrage "alle Unterverzeichnisse auflisten" der ersten Ergebnisse, einschließlich des incVerzeichnisses. Wenn Sie das selbst nicht in der Ausgabe haben möchten, lassen Sie den zweiten find mindestens Ordner mit der Tiefe 1 ausgeben.

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

Wir werden dann nur der Befehl umleiten stdoutin list.

slhck
quelle
Eine Variation dieser Antwort war hilfreich für mich, wo ich nur Tiefe 1 Unterverzeichnisse des ursprünglichen Spiels wollte find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Core
1

Okay, ich habe die Antwort gefunden, um diesen verschachtelten Fund zu simulieren:

find X/ -type d | grep "/inc/" > list
iammilind
quelle
Schön, das klappt auch! Doch in Unix / Linux - Shells, gibt es wirklich nicht so etwas wie die Antwort. Es ist eine Mischung aus persönlichen Vorlieben und dem, was leicht zu befolgen ist.
Vishal Kotcherlakota
Um sich um unkonventionelle (aber vorhandene) Dateinamen mit z. B. Zeilenumbrüchen zu kümmern: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( Begrenzt grep -zauch das Nullzeichen, aber seine Ausgabe scheint ebenfalls durch Null getrennt zu sein, sodass man es z. B. durchleiten muss xargs -0L1 echo, um es zeilenweise abzurufen ). In diesem Fall werden Zeilenumbrüche in Dateinamen weiterhin mehrdeutig dargestellt , da Sie die Liste mit jedem durch Zeilenumbrüche getrennten Eintrag in einer Datei speichern . Möglicherweise benötigen Sie nicht einmal die Zwischendatei, je nachdem, was Sie mit der Liste tun möchten.
Daniel Andersson
1

Versuche dies:

   find path-of-x -path '*/inc/*' -type d > list
Prinz John Wesley
quelle
Ich habe keine Linux-Maschine, um es jetzt zu testen ...
Prince John Wesley
Das funktioniert nicht. Aber danke, dass du mich "\inc\"
vorgeschlagen
@iammilind: versuchen Sie mit -pathFlagge
Prinz John Wesley