-depth
Podstawowej do find
powoduje, że aby przeprowadzić przeszukiwanie w głąb.
Jednak domyślna sekwencja nie jest szerokim wyszukiwaniem.
Domyślna sekwencja może być nieformalnie opisana jako „przejście przez pierwszą głębokość, która obsługuje węzły, gdy są one po raz pierwszy napotykane, zamiast robić to podczas cofania”.
Naprawdę potrzebuję pierwszego wyszukiwania. Jak mogę się find
zachowywać w ten sposób?
Na przykład z następującą konfiguracją:
$ mkdir -p alpha/{bravo,charlie,delta}
$ touch alpha/charlie/{alpha,beta,gamma,phi}
find
ma następujące domyślne zachowanie:
$ find alpha
alpha
alpha/charlie
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/delta
alpha/bravo
i przy -depth
zachowuje się następująco:
$ find alpha -depth
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/charlie
alpha/delta
alpha/bravo
alpha
Chcę jednak następującej (fikcyjnej) opcji:
$ find alpha -bfs
alpha
alpha/charlie
alpha/delta
alpha/bravo
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
Innymi słowy muszę find
przetworzyć / zgłosić wszystkie pliki / katalogi na określonej głębokości, zanim przejdę dalej.
Jak mogę to zrobić?
find
(przynajmniej nie tylkofind
). Czy chcesz tylko wyświetlić listę plików, czy chcesz użyć innych podstawowych?-bfs
że nie byłoby to dokładnie to, czego potrzebuję ... Mam prosty skrypt, który generuje indeks dużego projektu GitLab, odpowiedni do włączenia na Wiki GitLab. To sprawia, że nagłówki są hierarchicznie oparte na nazwach katalogów. Działa świetnie, z tym wyjątkiem, że w powyższej przykładowej strukturze pliku zostałby umieszczonydelta
pod nagłówkiemcharlie
zamiastalpha
nagłówka nadrzędnego .find
wyniki są sortowane alfabetycznie. Nie mam pojęcia, dlaczego ....-bfs
może się przydać, nawet jeśli nie pasuje idealnie do tego przypadku użycia.Odpowiedzi:
Możesz to zrobić za pomocą symboli wieloznacznych powłoki. Stwórz wzór z coraz większą liczbą poziomów katalogów.
To pomija pliki kropkowe. Użyj
FIGNORE='.?(.)'
w ksh,shopt -s dotglob
w bash lubsetopt glob_dots
w zsh, aby je uwzględnić.Ostrzeżenia:
Jeśli chcesz wybrać kolejność lub katalogi i inne niż katalogi, a wydajność nie jest krytyczna, możesz wykonać dwa przejścia i przetestować
[ -d "$file" ]
każde przejście.źródło
*
. :)nullglob
i użyj(($#))
jako warunku pętli, aby uniknąć tego przypadku krawędzi.# cat ./bfind
Działa to poprzez zwiększenie głębokości
find
i powtarzanie, myślę, że może powtarzać wyniki, ale może być łatwo filtrowaneźródło
Możesz potokować swoje
find
do sortowania, które sortuje przede wszystkim według liczby/
znaków w nazwie ścieżki. Na przykład,Służy to
awk
do prefiksu nazwy ścieżki liczbą ukośników ised
do usunięcia tego prefiksu na końcu.W rzeczywistości, ponieważ prawdopodobnie chcesz, aby zawartość katalogu
alpha/charlie+
była później wymienionaalpha/charlie
, musisz powiedziećsort -t/ -k1,1 -k2,2 -k3,3 -k4,4
do żądanej głębokości.źródło
Inna odpowiedź nie oparta na „znajdź”, ale na bash - najpierw użyj „długości katalogu nadrzędnego”, a następnie posortuj według alfy.
Odpowiedź nie do końca pasuje, ponieważ wyniki zawierają „charlie, bravo, delta”, ale zastanawiałem się, czy powinno to być „bravo, charlie, delta” w kolejności alfa.
To produkuje
źródło