Verwenden Sie den Befehl find von Unix, um Verzeichnisse zu finden, die dem Namen entsprechen, jedoch keine Unterverzeichnisse mit demselben Namen

7

Bearbeitet: Ich habe mein Problem fälschlicherweise falsch dargestellt. Ein genaueres Beispiel wird unten angezeigt.

Ich möchte alle Verzeichnisse in einem Zielverzeichnis rekursiv durchsuchen und jeden rekursiven Aufruf stoppen, nachdem das erste .git-Verzeichnis gefunden wurde.

Zum Beispiel, wenn wir diese Pfade haben:

/home/code/twitter/.git/
/home/code/twitter/some_file
/home/code/twitter/some_other_file 
/home/code/facebook/.git/
/home/code/facebook/another_file
/home/code/configs/.git/
/home/code/configs/some_module/.git/
/home/code/configs/another_module/.git/
/home/code/some/unknown/depth/until/this/git/dir/.git/
/home/code/some/unknown/depth/until/this/git/dir/some_file

Ich möchte nur diese Zeilen im Ergebnis:

/home/code/twitter
/home/code/facebook
/home/code/configs
/home/code/some/unknown/depth/until/this/git/dir/

Das -maxdepthhilft mir hier nicht weiter, weil ich nicht weiß, wie tief das erste .git-Verzeichnis für jedes Unterverzeichnis meines Ziels sein wird.

Ich dachte, ich find /home/code -type d -name .git -prunewürde es tun, aber es funktioniert nicht für mich. Was vermisse ich?

Gabe Hollombe
quelle
Es scheint, dass dies möglicherweise nicht möglich ist ... Ich werde diese Frage offen lassen, falls jemand anderes dies in Zukunft entdeckt und eine Antwort hat.
Gabe Hollombe

Antworten:

6

Klingt so, als ob Sie die -maxdepthOption möchten .

find / home / code -maxdepth 2 -typ d -name .git

Digital Chris
quelle
Ein guter Gedanke, aber es wird mir hier nicht helfen. Ich habe mein Beispiel aktualisiert, um mein Problem genauer wiederzugeben, und es tut mir so leid, dass ich es beim ersten Mal nicht richtig gemacht habe.
Gabe Hollombe
2

Es ist knifflig und maximal und Rekursions-Tricks helfen hier nicht weiter, aber hier ist, was ich tun würde:

find /home/code -type d -name ".git" | grep -v '\.git/'

Auf Englisch: Finde mir alle Verzeichnisse mit dem Namen ".git" und filtere alle Vorkommen in der Ergebnisliste heraus, die ".git /" (Punkt-Git-Schrägstrich) enthalten.

Die obige Befehlszeile funktioniert auf allen Unix-Systemen. Wenn Sie jedoch behaupten können, dass Ihr Fund "GNU find" ist, funktioniert dies auch:

find /home/code -type d -name ".git" ! -path "*/.git/*"

Habe Spaß.

Paxsali
quelle
Dies würde für das Problem völlig funktionieren, wie es ursprünglich von mir gefragt wurde. Leider habe ich nicht die richtige Frage für meine Situation gestellt. Ich habe mein Beispiel aktualisiert, um mein Problem genauer wiederzugeben, und es tut mir so leid, dass ich es beim ersten Mal nicht richtig gemacht habe. Können Sie noch einmal einen Blick darauf werfen und Erfahrungen austauschen?
Gabe Hollombe
In diesem Fall wird die Antwort von UnlimitedInfinity oben bereitgestellt ...
Paxsali
2

Suchen Sie alle Verzeichnisse, die ein .git-Unterverzeichnis enthalten:

find /home/code -type d -name .git -exec dirname {} \;
UnlimitedInfinity
quelle
1
Hmm. Dies scheint mir alle Verzeichnisse mit einem .git-Unterverzeichnis zurückzugeben. Aber ich möchte, dass es beim ersten Verzeichnis mit einem .git-Unterverzeichnis für jeden Rekursionszweig stoppt.
Gabe Hollombe
@GabeHollombe Sie gehen davon aus, dass dieses Verzeichnis /home/code/twitter/.git/ von find gefunden wird, bevor diese Verzeichnisse gefunden werden: / home / code / twitter / some_file / home / code / twitter / some_other_file. Warum machst du diese Annahme?
UnlimitedInfinity
Ja. Das ist ein fairer Punkt. Ich nehme an, es ist eher eine Anfrage, keine Annahme. Ich weiß, dass ich auch mit einfachen Skripten erreichen kann, was ich will. Ich habe mich nur gefragt, ob es einen einfachen Weg gibt, dies mit einem Befehl zu tun.
Gabe Hollombe
1
@GabeHollombe Eigentlich scheint es, dass findPunkt-Verzeichnisse vor Nicht-Punkt-Verzeichnissen verarbeitet werden; Ein Verzeichnis könnte jedoch mehrere .dirs haben, und in diesem Fall wäre die Ausgabe immer noch willkürlich. Ja, es sieht so aus, als müssten Sie die Rekursion selbst in einem Skript steuern. Ich dachte, vielleicht ist die Ausgabe für Sie wichtiger als das Blockieren der Rekursion, also habe ich mich mit dem Problem befasst ...
UnlimitedInfinity