Jak rekursywnie wyszukiwać nazwy katalogów w systemie Linux?

Jak rekursywnie wyszukiwać nazwy katalogów w systemie Linux?

W Linuksie wszystko jest przechowywane w katalogach, a podczas pisania skryptów basha często przydaje się wyszukiwanie katalogów po nazwie. Na szczęście możesz użyć find polecenia do rekursywnego wyszukiwania nazw katalogów i wyświetlania dopasowań.

Szukaj w katalogach

Polecenie find służy do wyszukiwania katalogów w systemie Linux. Domyślnie jest w pełni rekurencyjny, więc będzie szukał dopasowań we wszystkich podkatalogach.

Jeśli użyjesz -type d flagi, find będzie działać w „trybie katalogowym” i będzie szukać tylko katalogów, które nie pasują do żadnych plików. Możesz go używać razem -name do wyszukiwania katalogów według nazwy:

find. -type d -name "search"

To polecenie działa w bieżącym katalogu, ale może również przeszukiwać inne katalogi, takie jak ~.

Problem z używaniem -name polega na tym, że będzie pasować tylko do nazw bezpośrednich, co oznacza, że ​​nie będzie działać, jeśli nie będzie pasować do w pełni kwalifikowanej nazwy katalogu. Możesz jednak użyć symboli wieloznacznych, aby rozwiązać ten problem, a umieszczenie symbolu wieloznacznego przed i po wyszukiwanym ciągu dopasuje podciąg w dowolnym miejscu w nazwie katalogu. Jeśli dołączysz również nazwy plików, możesz użyć symboli wieloznacznych, aby dopasować pliki, które kończą się określonym rozszerzeniem.

find. -type d -name "*search*"

Jednak będzie to zgodne tylko z nazwą katalogu i nadal będzie ignorować katalog nadrzędny. Jeśli chcesz dopasować przy użyciu całej ścieżki pliku, musisz użyć opcji Regex opisanej poniżej.

findwypisze listę wszystkich pasujących katalogów, ale musisz być ostrożny, aby konsekwentnie używać bezwzględnych lub względnych ścieżek, ponieważ wpłynie to na ostateczną odpowiedź. Jeśli użyjesz ścieżki względnej, takiej jak kropka dla „bieżącego katalogu”, odpowiedzi będą względne. Ale jeśli określisz ścieżkę bezpośrednio, nawet jeśli jest to katalog bieżący, ścieżka będzie bezwzględna, zaczynając od katalogu głównego.

find to także coś więcej niż tylko wyszukiwanie tekstu — może być używane do dopasowywania plików na podstawie sygnatur czasowych, rozmiarów plików i innych identyfikatorów Linuksa. Może być również używany -exec do uruchamiania poleceń w każdym pliku lub katalogu.

Wyszukiwanie za pomocą wyrażeń regularnych

Możesz także użyć bardziej findzaawansowanego filtrowania wyrażeń regularnych (wyrażeń regularnych), aby znaleźć dopasowania dla złożonych wyszukiwań.

Jedną z głównych zalet korzystania z Regex jest to, że będzie on pasował do całego katalogu, w tym do prowadzących do niego katalogów podstawowych.

Możesz użyć wyrażenia regularnego -regex zamiast -name. Pomaga również dołączyć sedzgodne wyrażenie regularne z -regextype sed.

odnaleźć. -type d -regextype sed -regex „.*jeden\/.*”

W tym przykładzie wyrażenie regularne zaczyna się od .*one dopasowania wszystkich katalogów kończących się na „jeden”. Kropka i symbol wieloznaczny będą pasować do dowolnego podciągu poprzedzającego ten. Ukośnik jest następnie zmieniany tak \/ , aby pasował do końca katalogu, po którym następuje kolejny symbol wieloznaczny pasujący do dowolnej nazwy katalogu.

Ogólnie rzecz biorąc, będzie to pasować do każdego katalogu, którego rodzic kończy się na „jeden”, niezależnie od tego, gdzie się znajduje, nawet w podkatalogach. Regex to potężne wyrażenie i musisz uważać, aby Twoje wyrażenie odpowiadało dokładnie temu, czego chcesz — ni mniej, ni więcej.

Używanie grep z wyszukiwaniem

Ponieważ find może również wyświetlać nieprzetworzony wykaz katalogów, można go przekazać do innych poleceń w celu przetworzenia. Na przykład grep używany jako narzędzie do wyszukiwania tekstu i szybko używany w wierszu poleceń do prostego wyszukiwania i podświetlania.

find. -type d | grep foo

grep jest również kompletnym narzędziem wyszukiwania i może być używany z narzędziami, takimi jak wyrażenia regularne, w celu usprawnienia wyszukiwania. Możesz przeczytać nasz przewodnik dotyczący korzystania z niego, aby dowiedzieć się więcej.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *