Eine noch allgemeinere Version, die die Verwendung von find
Optionen ermöglicht:
#!/bin/bash
set -e
path="$1"
shift 1
while [[ $path != / ]];
do
find "$path" -maxdepth 1 -mindepth 1 "$@"
# Note: if you want to ignore symlinks, use "$(realpath -s "$path"/..)"
path="$(readlink -f "$path"/..)"
done
Zum Beispiel (vorausgesetzt, das Skript wird gespeichert als find_up.sh
)
find_up.sh some_dir -iname "foo*bar" -execdir pwd \;
... gibt die Namen aller some_dir
Vorfahren (einschließlich sich selbst) aus, /
in denen sich eine Datei mit dem Muster befindet.
Wenn Sie readlink -f
das obige Skript verwenden, folgen Sie den Symlinks auf dem Weg nach oben, wie in den Kommentaren angegeben. Sie können realpath -s
stattdessen verwenden, wenn Sie Pfade nach Namen verfolgen möchten ("/ foo / bar" wird zu "foo", auch wenn "bar" ein Symlink ist) - dies erfordert jedoch die Installation, realpath
die nicht standardmäßig auf installiert ist die meisten Plattformen.
realpath -s
Sie das gewünschte Verhalten erzielen.readlink
ist nicht Teil des Standards. Ein portierbares Skript kann nur mit POSIX-Shell-Funktionen implementiert werden.find
or nicht finden kannreadlink
. Ich schlage vor, es in so etwas wie zu ändern,$curpath
damit es die Shell-Variable nicht beschattet.Gibt das oberste Verzeichnis des aktuellen Repository aus, sofern Sie sich in einem befinden.
Weitere verwandte Optionen:
quelle
Eine verallgemeinerte Version von Gilles 'Antwort, dem ersten Parameter, der zur Suche nach Übereinstimmungen verwendet wird:
Hält die Verwendung von Sym-Links.
quelle
Find kann das nicht. Ich kann mir nichts Einfacheres vorstellen als eine Shell-Schleife. (Ungetestet, vorausgesetzt, es gibt keine
/.git
)Für den speziellen Fall eines Git-Repositorys können Sie Git die Arbeit für Sie erledigen lassen.
quelle
Wenn Sie zsh mit aktiviertem Extended Globbing verwenden, können Sie dies mit einem Oneliner tun:
Erklärung (zitiert von
man zshexpn
):Credits:
Faux
ein#zsh
für den ersten Vorschlag der Verwendung(../)#.git(:h)
.quelle
(../)
passiert ... Oh, und wer / was ist dasFaux on #zsh
?(../)
allein bedeutet nicht viel, sondern(../)#
bedeutet, dass Sie versuchen, das Muster in der Klammer 0 oder öfter zu erweitern und nur diejenigen zu verwenden, die tatsächlich im Dateisystem vorhanden sind. Da wir von 0 auf n übergeordnete Verzeichnisse expandieren, suchen wir effektiv bis zum Stammverzeichnis des Dateisystems (Anmerkung: Sie möchten wahrscheinlich etwas nach dem Muster hinzufügen, um es aussagekräftig zu machen, aber um die Aufklärung auszuführenprint -l (../)#
). Und#zsh
ist ein IRC-Kanal,Faux
ist ein Benutzername drauf.Faux
schlug die Lösung vor, daher der Kredit.(../)#.git(/Y1:a:h)
bei der ersten gefundenen (mit einer neueren Version von zsh) anhaltensetopt extended_glob
Diese Version von findup unterstützt die "find" -Syntax wie die Antwort von @ sinelaw, unterstützt jedoch auch Symlinks, ohne dass ein realer Pfad erforderlich ist. Es unterstützt auch eine optionale "Stopp bei" -Funktion, so dass dies funktioniert:
findup .:~ -name foo
... sucht nach foo, ohne das Heimatverzeichnis zu übergeben.quelle
Ich habe festgestellt, dass die Arbeit mit Symlinks einige der anderen Optionen zunichte macht. Besonders die Git-spezifischen Antworten. Ich habe auf halbem Weg meinen eigenen Favoriten aus dieser originellen Antwort erstellt, die ziemlich effizient ist.
Ich verwende Symlinks für meine go-Projekte, weil go Quellcode an einem bestimmten Ort haben möchte und ich meine Projekte gerne unter ~ / projects behalten möchte. Ich erstelle das Projekt in $ GOPATH / src und verknüpfe sie mit ~ / projects. So läuft
git rev-parse --show-toplevel
druckt das $ GOPATH Verzeichnis, nicht das ~ / Projekte Verzeichnis. Diese Lösung löst dieses Problem.Mir ist klar, dass dies eine sehr spezifische Situation ist, aber ich denke, dass die Lösung wertvoll ist.
quelle
Die Lösung von Vincent Scheib funktioniert nicht für Dateien, die sich im Stammverzeichnis befinden.
In der folgenden Version können Sie auch das Startverzeichnis als erstes Argument übergeben.
quelle
Ich habe die Lösung von sinelaw in POSIX geändert . Es folgt keinen Symlinks und durchsucht das Stammverzeichnis mithilfe einer do while-Schleife.
quelle