Jak w końcu odblokowałem polecenie find w systemie Linux

Poznaj polecenie `find` w Linuxie — niezwykle potężne narzędzie do lokalizacji plików, które, mimo swojej złożoności, znacznie ułatwia zarządzanie danymi.
Używam polecenia find od dziesięcioleci, ale nigdy tak naprawdę go nie rozumiałem — aż do teraz. Zmusiłem się, aby w końcu zgłębić to nieuchwytne polecenie, co okazało się kluczem do sukcesu.
Wprowadzenie do polecenia find
Polecenie find to jeden z najdziwniejszych programów w systemie Linux, z którym będziesz pracować. Jest na tyle ważne, że jest wszędzie, ale na tyle niejasne, że nikt go nie lubi. Istnieją alternatywy, takie jak fd, ale find jest najprostszym rozwiązaniem, które działa, w zasadzie.
W najprostszym przypadku użycie find jest bardzo proste:
find . -name '*.txt'Tego typu zapytanie znajduje wszystkie pliki w bieżącym katalogu lub w jakimkolwiek katalogu pod nim, które kończą się na ".txt". Jeśli na tym skończyłeś, prawdopodobnie nie wiesz, jak złożone potrafi być find. Jego strona podręcznika ma 1 639 linii (wersja 4.9.0), a gdy zaczniesz zgłębiać find, zaczyna wyglądać mniej jak użyteczne narzędzie, a bardziej jak pełnoprawny język programowania.
Taka złożoność zawsze mnie odrzucała w przeszłości. Od dawna szukałem prostego sposobu na znalezienie plików, które edytowałem ostatnio, ale zawsze mi to umykało. Wyniki były pełne plików .git lub były nieposortowanym bałaganem. Postanowiłem więc usiąść i w końcu zrozumieć find; efekt był refreshing.
Podstawowe użycie find wygląda tak:
find [punkt_startowy...] [wyrażenie]Find wykonuje następnie następujące kroki, aby zrealizować swoją pracę:
- Przetwarza każdy plik i katalog w punktach startowych; obsługiwane są wiele punktów startowych.
- Stosuje testy; jeśli plik przejdzie wszystkie, podejmuje działanie.
- Działanie: domyślne działanie to -print, które drukuje pełną nazwę pliku.
Proste polecenie find, bez argumentów, wypisuje wszystko poniżej bieżącego katalogu:
Może to być dość przydatne, ale prawdziwa moc find tkwi w testach i działaniach, które wspiera.
Znajdowanie niedawno zmienionych plików
Gdy pracujesz nad bardziej złożonym zadaniem, warto zaplanować, co potrzebujesz, a następnie stopniowo wypracować, jak to osiągnąć. Dla zachowania, którego szukam, wiem, że potrzebuję:
- Plików, które posiadam.
- Plików, które nie znajdują się w ukrytych katalogach.
- Wyników posortowanych według daty, z wyświetlonymi datami.
Przydatne jest również posiadanie kilku danych testowych, aby sprawdzić, czy twoje polecenie działa tak, jak chcesz. W tym przypadku używam następującej struktury plików:
Znajdowanie plików posiadanych przez użytkownika
Pierwsze zadanie jest proste, dzięki testowi -user find, który pasuje do pliku tylko wtedy, gdy posiadany jest przez bieżącego użytkownika:
find . -user "${USER}"Jeśli uruchomisz powyższe polecenie, możesz zauważyć, że wyniki zawierają katalogi:
Aby upewnić się, że ostateczna lista zawiera tylko pliki, użyj testu -type w find. Przyjmuje on pojedynczy znak oznaczający typ pliku do dopasowania: f dla pliku regularnego, d dla katalogu, i l dla linku symbolicznego, między innymi:
find . -user "${USER}" -type fNa tym etapie find zgłasza wszystkie pliki — nie katalogi — posiadane przez bieżącego użytkownika:
Znajdowanie plików, które nie znajdują się w ukrytych katalogach
Następnym krokiem jest zatrzymanie find przed zgłaszaniem plików z ukrytych katalogów. Akcja -prune informuje find, aby nie wchodził do dopasowanego katalogu:
find . -path "*/.*/*" -pruneWyniki tego polecenia mogą na początku wydawać się dziwne, niemal odwrotne do tego, czego chcemy:
To dlatego, że sposób, w jaki działa akcja prune, wygląda następująco:
- Test -path dopasowuje wszystkie pliki (w tym katalogi) z ścieżką, która zawiera przynajmniej jeden ukryty katalog.
- Akcja -prune uniemożliwia find wejście do tych katalogów.
- Ponieważ nie ma akcji poza -prune, find domyślnie stosuje akcję -print. To polecenie jest równoważne z
find . -path "*/.*/*" -prune -print.
Zamiast drukować ukryte katalogi, które zostały usunięte, można jednak wydrukować wszystko inne, używając -o:
find . -path "*/.*/*" -prune -o -printOperator -o to logiczne OR, co oznacza, że find dopasuje albo...
Poprzednie wyrażenie lub następne. Jeśli ścieżka ma ukryty katalog, zostanie pominięta; w przeciwnym razie zostanie wydrukowana (wyrażenie bez testu zawsze będzie dopasowywane).
Na tym etapie możesz połączyć oryginalne wyrażenie, które filtrowało według właściciela i typu pliku:
find . -path "*/.*/*" -prune -o -user "${USER}" -type f -printTo polecenie find lokalizuje wszystkie wymagane pliki, i nic więcej:
Co pozostaje, to posortować je według daty ostatniej modyfikacji i wyświetlić tę datę obok każdego pliku.
Możesz użyć testu -path, aby osiągnąć te same wyniki, z nieco krótszym poleceniem:
find . -type f -not -path '*/.*/*' -user "${USER}" Jeśli spróbujesz tego, uzyskasz te same wyniki, co wersja używająca -prune. Różnica polega na tym, że -prune jest bardziej wydajne, ponieważ unika testowania plików w ukrytych katalogach. Jeśli pracujesz z wieloma katalogami, zawsze powinieneś używać -prune, aby pominąć te, które możesz.
Sortowanie wyników i ładne wydruki
Polecenie find nie obsługuje sortowania samodzielnie; do tego zadania możesz użyć sort, jednego z podstawowych poleceń przetwarzania tekstu. Najpierw jednak potrzebujesz daty modyfikacji dla każdego pliku. Akcja -printf mówi find dokładnie, jak chcesz, aby jego wyjście wyglądało:
find . -path "*/.*/*" -prune -o -user "${USER}" -type f -printf "%TY-%Tm-%Td %p\n"Akcja -printf wykorzysta zawartość cytowanego ciągu do formatowania informacji o plikach. W tym przykładzie %TY odnosi się do roku ostatniej modyfikacji. %Tm i %Td to odpowiednio miesiąc i dzień, podczas gdy %p to nazwa pliku.
Możesz określić bardziej szczegółową datę, aby uzyskać dokładniejsze sortowanie, ale interesują mnie tylko daty, więc ostatnim krokiem jest przekazanie do sort. Zauważ, że porządkuję każdy wiersz z datą na początku. Ma to dwa cele: wszystko jest ładnie wyrównane, ale także czyni sortowanie trywialnym zadaniem. Po prostu przekaż wyniki z find do sort:
find . -path "*/.*/*" -prune -o -user "${USER}" -type f -printf "%TY-%Tm-%Td %p\n" | sortJeśli ciekawią Cię artykuły podobne do Jak w końcu odblokowałem polecenie find w systemie Linux, zajrzyj do kategorii Linux i odkryj jeszcze więcej interesujących treści.
Dodaj komentarz

Możesz być zainteresowany