Jeszcze bardziej ogólna wersja, która umożliwia korzystanie z find
opcji:
#!/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
Na przykład (zakładając, że skrypt zostanie zapisany jako find_up.sh
)
find_up.sh some_dir -iname "foo*bar" -execdir pwd \;
... wypisze nazwy wszystkich some_dir
przodków (w tym siebie), aż do /
znalezienia pliku ze wzorem.
Podczas korzystania readlink -f
z powyższego skryptu w drodze w górę będą podążać dowiązania symboliczne, jak zauważono w komentarzach. Zamiast tego możesz użyć realpath -s
, jeśli chcesz podążać ścieżkami według nazwy („/ foo / bar” przejdzie do „foo”, nawet jeśli „bar” jest dowiązaniem symbolicznym) - wymaga to jednak instalacji, realpath
która nie jest domyślnie instalowana na większość platform.
realpath -s
aby uzyskać pożądane zachowanie.readlink
nie jest częścią standardu. Przenośny skrypt można zaimplementować tylko z funkcjami powłoki POSIX.find
lubreadlink
. Sugeruję zmianę go na coś podobnego$curpath
zamiast tego, aby nie przesłaniała zmiennej powłoki.wydrukuje katalog najwyższego poziomu bieżącego repozytorium, jeśli w nim jesteś.
Inne powiązane opcje:
źródło
Uogólniona wersja odpowiedzi Gillesa, pierwszy parametr użyty do znalezienia dopasowania:
Utrzymuje użycie łączy sym.
źródło
Find nie może tego zrobić. Nie mogę wymyślić nic prostszego niż pętla powłoki. (Nieprzetestowane, zakłada, że nie ma
/.git
)W konkretnym przypadku repozytorium git możesz pozwolić git wykonać za ciebie pracę.
źródło
Jeśli używasz zsh z włączonym rozszerzonym globowaniem, możesz to zrobić za pomocą programu oneliner:
Objaśnienie (cytowane z
man zshexpn
):Kredyty:
Faux
włączone#zsh
dla początkowej sugestii użycia(../)#.git(:h)
.źródło
(../)
robi ... Och, a kto / co jestFaux on #zsh
?(../)
Sam @alexgray nie znaczy wiele, ale(../)#
oznacza próbę rozszerzenia wzorca w nawiasie 0 lub więcej razy i używaj tylko tych, które faktycznie istnieją w systemie plików. Ponieważ rozwijamy się od 0 do n katalogów nadrzędnych, skutecznie wyszukujemy w górę do katalogu głównego systemu plików (uwaga: prawdopodobnie chcesz dodać coś po wzorcu, aby było to znaczące, ale aby wykonać oświecenieprint -l (../)#
). I#zsh
jest kanałem IRC,Faux
jest na nim nazwą użytkownika.Faux
zasugerował rozwiązanie, dlatego kredyt.(../)#.git(/Y1:a:h)
zatrzymać się przy pierwszym znalezionym (z najnowszą wersją zsh)setopt extended_glob
Ta wersja wyszukiwania obsługuje składnię „znajdź”, jak odpowiedź @ sinelaw, ale obsługuje także dowiązania symboliczne bez potrzeby podawania prawdziwej ścieżki. Obsługuje również opcjonalną funkcję „stop at”, więc działa to:
findup .:~ -name foo
... wyszukuje foo bez podawania katalogu domowego.źródło
Odkryłem, że praca z dowiązaniami symbolicznymi zabija niektóre inne opcje. Zwłaszcza odpowiedzi na konkretne pytania. W połowie drogi stworzyłem swoją ulubioną z tej oryginalnej odpowiedzi, która jest dość skuteczna.
Używam dowiązań symbolicznych do moich projektów go, ponieważ go chce kodu źródłowego w określonej lokalizacji i lubię trzymać moje projekty w ~ / projects. Tworzę projekt w $ GOPATH / src i dowiązuję symbolicznie do ~ / projects. Tak działa
git rev-parse --show-toplevel
wypisuje katalogu $ GOPATH, a nie w katalogu ~ / projektów. To rozwiązanie rozwiązuje ten problem.Zdaję sobie sprawę, że jest to bardzo specyficzna sytuacja, ale myślę, że to rozwiązanie jest cenne.
źródło
Rozwiązanie Vincenta Scheiba nie działa w przypadku plików znajdujących się w katalogu głównym.
Poniższa wersja zawiera, a także pozwala przekazać katalog początkowy jako pierwszy argument.
źródło
Zmodyfikowałem rozwiązanie sinelaw na POSIX. Nie podąża za dowiązaniami symbolicznymi i obejmuje przeszukiwanie katalogu głównego za pomocą pętli do while.
źródło