pierwsza opcja w narzędziu Linux „znajdź”?


12

Czy w Linux-owym narzędziu „find” jest jakaś opcja szerokości / szerokości-pierwszej?

Odpowiedzi:


5

Nie ma nic wbudowanego do znalezienia, nawet GNU find. Możesz przetworzyć dane wyjściowe w findcelu sortowania według liczby ukośników, na przykład za pomocą Perla:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> jest listą wszystkich linii wejściowych;
  • $a =~ s!/!/!gto liczba ukośników $a, których używamy jako kryterium sortowania.

Jeśli możesz użyć zsh:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* wyświetla wszystkie pliki w bieżącym katalogu i podkatalogach.
  • W nawiasach znajduje się kwalifikator globalny.
  • Kwalifikator glob oekontroluje kolejność zwracania dopasowań: są one sortowane według wartości REPLYpo uruchomieniu kodu tutaj w cudzysłowach dla każdego dopasowania z REPLYpoczątkowo ustawioną zgodną ścieżką.
  • Wspomniany kod przekształca się, $REPLYaby usunąć wszystko oprócz ukośników. Wynik składa się ze wszystkiego na głębokości 1 (wynik pusty $REPLY), a następnie wszystkiego na głębokości 2 ( $REPLYkończy się na /), głębokości 3 ( //) itp.

1
Proces sortowania jest bardzo interesujący, jednak sortowanie wymaga znalezienia do ukończenia i nie będziesz miał szansy kontrolować przerwania.
Xiè Jìléi


1

Mam wrażenie, że możesz. Obejmuje grep i takie oraz pętlę, ale uważam, że działa bardzo dobrze, szczególnie w twoim przypadku, że znalezienia nie trzeba uzupełniać.

Jest bardziej zasobochłonny z powodu:

  • Dużo rozwidlenia
  • Wiele znalezisk
  • Każdy katalog przed bieżącą głębokością jest trafiany przez znajdowanie tyle razy, ile jest całkowita głębokość struktury pliku (nie powinno to stanowić problemu, jeśli masz praktycznie dowolną ilość ram ...)

Jest to dobre, ponieważ:

  • Wykorzystuje bash i podstawowe narzędzia GNU
  • Można go złamać, kiedy tylko chcesz (tak jak widzisz to, czego szukałeś)
  • Działa na linii, a nie na znalezieniu, więc kolejne polecenia nie muszą czekać na szukanie i sortowanie
  • Działa w oparciu o rzeczywistą separację systemu plików, więc jeśli masz katalog z ukośnikiem, nie będzie on wymieniony głębiej niż jest; jeśli masz skonfigurowany inny separator ścieżek, nadal nic ci nie jest.
#! / bin / bash 
głębokość = 0

podczas szukania -mindepth $ głębokość -maxdepth $ głębokość | grep ”.”
robić
    głębokość = $ ((głębokość + 1))
gotowy

Możesz również łatwo dopasować go do jednej linii dość (?):

depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done

Ale wolę małe skrypty niż pisanie ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.