Przejdź do pierwszej, poprzedniej, następnej, ostatniej sekcji, spisu treści.


2. Znajdowanie plików

Domyślnie, find wypisuje na standardowe wyjście nazwy plików spełniających zadane warunki. Zob. 3. Akcje, gdzie opisano, jak uzyskać więcej informacji o pasujących plikach.

2.1. Nazwa

A oto metody wyszukiwania plików, których nazwy pasują do określonego wzorca. Zob. 2.1.4. Dopasowywanie wzorców powłoki, gdzie opisano argumenty typu wzorzec, używane w takich testach.

Każdy z tych testów występuje w wersji rozróżniającej wielkość liter i w wersji nierozróżniającej. Nazwy tych ostatnich zaczynają się od `i' (case-insensitive). W porównywaniu nieodróżniającym wielkości liter wzorce `fo*' i `F??' dopasowują nazwy plików `Foo', `FOO', `foo', `fOo', itp.

2.1.1. Wzorce głównej części nazwy

Test: -name wzorzec
Test: -iname wzorzec
Prawdziwy, jeśli główna część nazwy pliku (ścieżka z usuniętymi występującymi na początku katalogami) pasuje do wzorca powłoki wzorzec. W przypadku `-iname' dopasowywanie nie uwzględnia wielkości liter. Do pominięcia całego drzewa katalogowego służy opcja `-prune' (zob. 2.9. Katalogi). Jako przykład, polecenie znajdujące pliki źródłowe Texinfo w `/usr/local/doc':

find /usr/local/doc -name '*.texi'

2.1.2. Wzorce pełnej nazwy

Test: -path wzorzec
Test: -ipath wzorzec
Prawdziwy, jeśli cała nazwa pliku, poczynając od argumentu wiersza poleceń, pod którym znaleziono plik, pasuje do wzorca powłoki wzorzec. W przypadku `-ipath' dopasowywanie nie uwzględnia wielkości liter. Do pominięcia całego drzewa katalogowego stosuje się opcję `-prune', zamiast sprawdzać każdy plik drzewa (zob. 2.9. Katalogi).

Test: -regex wyraż
Test: -iregex wyraż
Prawdziwy, jeśli cała nazwa pliku pasuje do wyrażenia regularnego wyraż. Jest to dopasowanie do pełnej ścieżki, nie szukanie. Na przykład, żeby dopasować plik o nazwie `./fubar3', można użyć wyrażenia regularnego `.*bar.' lub `.*b.*3', ale nie `b.*r3'. Zob. `Syntax of Regular Expressions' w The GNU Emacs Manual, gdzie opisano składnię wyrażeń regularnych. W przypadku `-iregex' dopasowywanie nie uwzględnia wielkości liter.

2.1.3. Szybkie wyszukiwanie pełnej nazwy

Do szybkiego wyszukiwania plików po nazwie, bez konieczności faktycznego przeglądania katalogów na dysku (co może być powolne), można skorzystać z programu locate. Dla każdego podanego wzorca przeszukuje on jedną lub kilka baz z nazwami plików i wyświetla te nazwy, które go zawierają. @xref{}, gdzie dokładniej omówiono wzorce powłoki.

Jeśli wzorzec jest zwykłym łańcuchem -- nie zawiera żadnych metaznaków -- locate wyświetla wszystkie nazwy plików z bazy zawierające ten łańcuch. jeżeli wzorzec zawiera metaznaki, program wyświetla tylko te nazwy plików, które dokładnie odpowiadają wzorcowi. Wskutek tego, wzorce zawierające metaznaki powinny się na ogół zaczynać od `*' i najczęściej również tak się kończą. Wyjątkami są wzorce, które mają jawnie dopasowywać początek lub koniec nazwy pliku.

Polecenie

locate wzorzec

jest niemal równoważne poleceniu

find katalogi -name wzorzec

gdzie katalogi są tymi katalogami, o których dane są zawarte w bazach nazw plików. Różnice polegają na tym, że informacje locate mogą być nieaktualne oraz na tym, że locate obsługuje znaki uogólniające we wzorcach nieco inaczej niż find (zob. 2.1.4. Dopasowywanie wzorców powłoki).

Bazy nazw plików zawierają listy plików istniejących w systemie w momencie ostatniej aktualizacji baz. Administrator powinien wybrać nazwę pliku domyślnej bazy, częstość, z jaką mają być odświeżane bazy, oraz katalogi, dla których mają zawierać wpisy.

W poniższy sposób wybiera się bazy nazw plików, które mają być przeszukane przez locate. Bazy domyślne zależą od systemu.

--database=ścieżka
-d ścieżka
Zamiast przeszukiwania domyślnej bazy nazw plików, przeszukiwane będą bazy ze ścieżki, która jest listą rozdzielonych dwukropkami nazw plików baz. Do ustawienia listy przeszukiwanych plików baz można też użyć zmiennej środowiskowej LOCATE_PATH. Jeżeli zostaną zastosowane obie, to opcja przesłania ustawienia zmiennej środowiskowej.

2.1.4. Dopasowywanie wzorców powłoki

find i locate potrafią porównywać nazwy plików, lub części tych nazw, z wzorcami powłoki. Wzorzec powłoki jest łańcuchem, który może zawierać poniższe znaki specjalne, znane jako znaki uogólniające lub metaznaki.

Wzorce zawierające metaznaki muszą być cytowane, by uchronić je przez rozwinięciem przez samą powłokę. Działają zarówno cudzysłowy, jak i apostrofy; również cytowanie odwrotnym ukośnikiem.

*
Dopasowuje zero lub więcej znaków.
?
Dopasowuje jeden dowolny znak.
[łańcuch]
Dopasowuje dokładnie jeden znak będący elementem łańcucha łańcuch. Nazywa się to klasą znaków. Dla uproszczenia, łańcuch może zawierać zakresy, które składają się z dwu znaków z kreską między nimi. Na przykład, klasa `[a-z0-9_]' dopasowuje małą literę, cyfrę lub znak podkreślenia. Klasę można zanegować, umieszczając bezpośrednio po nawiasie otwierającym znak `!' lub `^'. Zatem, `[^A-Z@]' dopasowuje dowolny znak oprócz dużej litery bądź znaku at (`@').
\
Usuwa specjalne znaczenie znaku, który po nim następuje. Działa to nawet w klasach znaków.

W testach find wykonujących dopasowywanie wzorców powłoki (`-name', `-path', itd.) znaki uogólniające wzorca nie dopasowują kropki `.' występującej na początku nazwy pliku. W przypadku locate tak nie jest. Zatem, `find -name '*macs'' nie dopasuje pliku o nazwie `.emacs', ale `locate '*macs'' - tak.

Znaki ukośnika nie mają żadnego specjalnego znaczenia w dopasowywaniu wzorców wykonywanym przez find i locate, w przeciwieństwie do powłoki, gdzie znaki uogólniające ich nie dopasowują. Stąd też, wzorzec `foo*bar' może dopasować nazwę pliku `foo3/bar', a wzorzec `./sr*sc' nazwę `./src/misc'.

2.2. Dowiązania

Istnieją dwa sposoby, w jakie mogą być połączone pliki. Dowiązania symboliczne (symbolic links) to specjalny rodzaj pliku, którego zawartość jest fragmentem nazwy innego pliku. Dowiązania twarde (hard links) są wieloma wpisami katalogowymi dla tego samego, jednego pliku -- wszystkie te nazwy plików mają ten sam numer indeksowy węzła (numer i-węzła, inode) na dysku.

2.2.1. Dowiązania symboliczne

Test: -lname wzorzec
Test: -ilname wzorzec
Prawdziwy, jeśli plik jest dowiązaniem symbolicznym, którego zawartość pasuje do wzorca powłoki wzorzec. W przypadku `-ilname' dopasowywanie nie uwzględnia wielkości liter. Zob. 2.1.4. Dopasowywanie wzorców powłoki, gdzie dokładniej omówiono argument wzorzec. Zatem, listę dowiązań symbolicznych do pliku `sysdep.c' położonych w bieżącym katalogu i jego podkatalogach można uzyskać pisząc:

find . -lname '*sysdep.c'

Opcja: -follow
Dereferencja dowiązań symbolicznych. [tłum.: usuwanie pośredniości - działanie na plikach wskazywanych przez dowiązania, a nie na samych dowiązaniach]. Jeśli podano tę opcję, to występują następujące różnice w zachowaniu się programu:

2.2.2. Dowiązania twarde

Aby znaleźć dowiązania twarde, należy najpierw uzyskać numer i-węzła pliku, którego dowiązań szukamy. Numer i-węzła pliku i liczbę dowiązań do niego można poznać uruchamiając `ls -i' lub `find -ls'. Jeśli plik ma więcej niż jedno dowiązanie, to pozostałych można szukać podając numer i-węzła jako argument dla `-inum'. Jeżeli wyszukiwanie będzie rozpoczęte w katalogu, w którym są zamontowane inne systemy plików, jak `/usr' w przypadku wielu systemów, to należy dodać opcję `-xdev'. Takie postępowanie oszczędza niepotrzebnego szukania, gdyż dowiązania twarde do pliku muszą leżeć na tym samym systemie plików. Zob. 2.10. Systemy plików.

Test: -inum n
Plik ma numer i-węzła równy n.

Można też szukać plików, które mają określoną liczbę dowiązań. Robi się to za pomocą opcji `-links'. Katalogi mają normalnie dwa dowiązania twarde: tym drugim jest zawarta w nich pozycja `.'. Jeżeli mają podkatalogi, każdy z nich ma też dowiązanie twarde o nazwie `..' do swego katalogu nadrzędnego.

Test: -links n
Plik ma n dowiązań twardych.

2.3. Czas

Każdy plik ma trzy znaczniki czasu, które dokumentują kiedy ostatnio wykonano pewne operacje na pliku. Są to czasy:

  1. dostępu (odczytu zawartości pliku); [access]
  2. zmiany statusu (modyfikacji pliku lub jego atrybutów, [zmiany metainformacji i-węzła]); [change]
  3. modyfikacji (zmiany zawartości pliku); [modify]

Można szukać plików, których znaczniki czasu mieszczą się w określonym przedziale wiekowym lub też porównywać je z innymi znacznikami czasu.

2.3.1. Zakresy wieku

Te testy są przydatne głównie z zakresami (`+n' i `-n').

Test: -atime n
Test: -ctime n
Test: -mtime n
Prawdziwy, jeśli do danego pliku ostatnio sięgano (lub, odpowiednio, zmieniano jego status albo modyfikowano zawartość) n*24 godziny temu.

Test: -amin n
Test: -cmin n
Test: -mmin n
Prawdziwy, jeśli do danego pliku ostatnio sięgano (lub, odpowiednio, zmieniano jego status albo modyfikowano zawartość) n minut temu. Te testy zapewniają precyzyjniejszy pomiar niż `-atime' i s-ka. Na przykład, do wylistowania plików w `/u/bill', które były ostatnio odczytywane od 2 do 6 godzin temu:

find /u/bill -amin +2 -amin -6

Opcja: -daystart
Mierzy czas od początku dzisiejszego dnia, a nie od 24 godzin temu. Zatem, do wypisania zwykłych plików ze swojego katalogu domowego, które zostały zmienione wczoraj, używamy:

find ~ -daystart -type f -mtime 1

2.3.2. Porównywanie znaczników czasu

Zamiast porównywać znaczniki czasu z aktualnym czasem, można porównywać je ze znacznikiem innego pliku. Znacznik tego pliku odniesienia może być aktualizowany przez inny program wtedy, gdy wystąpi jakieś zdarzenie. Można też, stosując polecenie touch, ustawić go na jakąś konkretną stałą datę. Na przykład, do wypisania plików w `/usr' zmodyfikowanych po 1 lutego bieżącego roku:

touch -t 02010000 /tmp/stamp$$
find /usr -newer /tmp/stamp$$
rm -f /tmp/stamp$$

Test: -anewer plik
Test: -cnewer plik
Test: -newer plik
Prawdziwy, jeśli do danego pliku ostatnio sięgano (lub, odpowiednio, zmieniano jego status albo modyfikowano zawartość) później, niż został zmodyfikowany plik. Testy te uwzględniają opcję `-follow' tylko wtedy, gdy w wierszu poleceń występuje ona przed nimi. Zob. 2.2.1. Dowiązania symboliczne, gdzie dokładniej opisano `-follow'. Na przykład, listę plików zmodyfikowanych od czasu ostatniej modyfikacji `/bin/sh' uzyskamy tak:

find . -newer /bin/sh

Test: -used n
Prawdziwy, jeśli do danego pliku ostatnio sięgano n dni po ostatniej zmianie jego statusu. Przydatne do znajdowania plików, które nie są używane, i które prawdopodobnie można by zarchiwować lub usunąć, by zaoszczędzić miejsca na dysku.

2.4. Rozmiar

Test: -size n[bckw]
Prawdziwy, jeśli plik wykorzystuje n jednostek miejsca, w zaokrągleniu w górę. Jednostki to domyślnie bloki 512-bajtowe, ale można to zmienić dodając do n jednoznakowy przyrostek:

b
bloki 512-bajtowe
c
bajty
k
kilobajty (1024 bajtów)
w
2-bajtowe słowa

Do rozmiaru nie są wliczane bloki niebezpośrednie, ale są wliczane bloki w plikach rzadkich (sparse), które faktycznie nie są przydzielone.

Test: -empty
Prawdziwy, jeśli plik jest pusty i jest albo zwykłym plikiem albo katalogiem. Z tego powodu może to być dobry kandydat do usunięcia. Ten test przydaje się w połączeniu z `-depth' (zob. 2.9. Katalogi) i `-exec rm -rf '{}' ';'' (zob. 3.3.1. Pojedynczy plik).

2.5. Typ

Test: -type c
Prawdziwy, jeśli plik jest typu c:

b
blokowy [block] (buforowany) specjalny
c
znakowy [character] (niebuforowany) specjalny
d
katalog [directory]
p
potok nazwany [named pipe] (FIFO)
f
zwykły plik [regular file]
l
dowiązanie symboliczne [symbolic link]
s
gniazdo [socket]

Test: -xtype c
To samo, co `-type', chyba że plik jest dowiązaniem symbolicznym. Dla dowiązań symbolicznych: jeśli nie podano `-follow', to test daje prawdę jeżeli dany plik jest dowiązaniem do pliku typu c; jeśli podano `-follow', to daje prawdę gdy znakiem c jest `l'. Inaczej mówiąc, w przypadku dowiązań symbolicznych `-xtype' sprawdza typ tych plików, czego `-type' nie robi. Zob. 2.2.1. Dowiązania symboliczne, gdzie bliżej opisano `-follow'.

2.6. Właściciel

Test: -user nazwa_uż
Test: -group nazwa_gr
Prawdziwy, jeśli plik jest własnością użytkownika nazwa_uż (należy do grupy nazwa_gr). Dopuszcza się użycie identyfikatora numerycznego.

Test: -uid n
Test: -gid n
Prawdziwy, jeśli numerycznym identyfikatorem użytkownika (grupy) będącego właścicielem pliku jest n. Te testy, w przeciwieństwie do `-user' i `-group', obsługują zakresy (`+n' i `-n').

Test: -nouser
Test: -nogroup
Prawdziwy, jeśli numerycznemu identyfikatorowi użytkownika pliku nie odpowiada żaden użytkownik (numerycznemu identyfikatorowi grupy nie odpowiada żadna grupa). Przypadki te oznaczają zwykle, że pliki należały do użytkowników, których potem usunięto z systemu. Prawdopodobnie powinno się zmienić właściciela (grupę) takich plików na istniejącego. Służą do tego programy chown i chgrp.

2.7. Prawa

Zob. 6. Prawa pliku, gdzie opisano, jaką budowę mają prawa pliku i jak je podawać.

Test: -perm tryb
Prawdziwy, jeśli prawa pliku to dokładnie tryb (który może być numeryczny lub symboliczne). Tryby symboliczne jako punktu wyjścia używają trybu 0. Jeżeli tryb zaczyna się od `-', to test daje prawdę gdy wszystkie prawa ustawione w trybie są ustawione dla pliku; prawa nie ustawione w trybie są ignorowane. Jeżeli tryb zaczyna się od `+', to test daje prawdę gdy którekolwiek z praw ustawionych w trybie jest ustawione dla pliku; prawa nie ustawione w trybie są ignorowane.

2.8. Zawartość

Do wyszukania plików według ich zawartości można użyć programu grep. Na przykład, można dowiedzieć się, które pliki źródłowe w języku C z bieżącego katalogu zawierają łańcuch znakowy `thing', pisząc:

grep -l thing *.[ch]

Jeżeli chcemy ten łańcuch wyszukać również w plikach w podkatalogach, można połączyć grep z find i xargs, tak:

find . -name '*.[ch]' | xargs grep -l thing

Opcja `-l' powoduje, że grep wypisuje tylko nazwy plików zawierających dany łańcuch, a nie linie które go zawierają. Argument określający łańcuch (`thing') jest w rzeczywistości wyrażeniem regularnym, więc może zawierać metaznaki. Metodę można nieco wygładzić, wykorzystując opcję `-r', dzięki której xargs nie będzie uruchamiać programu grep jeżeli find nie da żadnego wyjścia. Zastosowanie akcji `-print0' programu grep oraz opcji `-0' programu xargs pozwoli na uniknięcie błędnej interpretacji tych nazw plików, które zawierają spacje:

find . -name '*.[ch]' -print0 | xargs -r -0 grep -l thing

Informacje o pełniejszej obróbce szukania plików, których zawartość pasuje do wzorca, znajdują się w podręczniku systemowym programu grep.

2.9. Katalogi

Poniżej opisano, jak decydować o tym, które katalogi i w jaki sposób find ma przeszukiwać. Te dwie opcje umożliwiają przetwarzanie poziomego wycinka drzewa katalogowego:

Opcja: -maxdepth poziomy
Program zejdzie nie głębiej niż poziomy (całkowita nieujemna) poziomów katalogów poniżej argumentów wiersza poleceń. `-maxdepth 0' oznacza, że testy i akcje zostaną zastosowane tylko do argumentów wiersza poleceń.

Opcja: -mindepth poziomy
Nie będą stosowane żadne testy ani akcje na poziomach mniejszych niż poziomy (całkowita nieujemna). `-mindepth 1' oznacza przetwarzanie wszystkich plików z wyjątkiem argumentów wiersza poleceń.

Opcja: -depth
Przetwarzanie zawartości katalogu przed samym katalogiem. Warto z tego korzystać podczas tworzenia list plików do archiwacji za pomocą cpio lub tar. Jeżeli katalog nie ma prawa zapisu dla swojego właściciela, to zawartość można mimo to odtworzyć z archiwum, gdyż prawa katalogu są odtwarzane po jego zawartości.

Akcja: -prune
Jeżeli nie podano `-depth', to prawdziwa; program nie wchodzi w głąb bieżącego katalogu. Jeżeli podano `-depth', fałszywa; bez skutków. `-prune' wpływa tylko na testy i akcje, które w wyrażeniu występują po niej, nie na poprzedzające ją.

Na przykład, do pominięcia katalogu `src/emacs' i wszystkich plików i katalogów pod nim oraz wypisania nazw pozostałych znalezionych plików używamy:

find . -path './src/emacs' -prune -o -print

Opcja: -noleaf
Nie jest wykonywana optymalizacja polegająca na przyjęciu, że katalogi zawierają o dwa podkatalogi mniej niż liczba ich dowiązań twardych. Opcja ta jest potrzebna podczas przeszukiwania systemów plików niestosujących się do uniksowej konwencji dowiązań katalogów, takich jak systemy plików CD-ROM lub MS-DOS, czy punkty montowania wolumenów AFS. Każdy katalog w zwykłym uniksowym systemie plików ma co najmniej dwa dowiązania twarde: swoją nazwę i wpis `.' (kropka). Dodatkowo, każdy z jego podkatalogów (jeśli są) ma wpis `..' dowiązany do tego katalogu. Podczas badania katalogu, find, po zbadaniu funkcją stat o dwa podkatalogi mniej niż wynosi liczba dowiązań tego katalogu, wie, że reszta wpisów w nim to nie-katalogi (pliki-liście (leaf) drzewa katalogowego). Jeśli mają być badane tylko nazwy tych plików, nie ma potrzeby sprawdzać informacji o ich statusie. Daje to znaczący wzrost szybkości wyszukiwania.

2.10. Systemy plików

System plików (filesystem) to część dysku, albo maszyny lokalnej, albo zamontowany ze zdalnego hosta poprzez sieć. Przeszukiwanie sieciowych systemów plików może być powolne, więc często nakazuje się programowi find, by ich unikał.

Są dwie metody unikania przeszukiwania określonych systemów plików. Pierwszą jest wskazanie programowi, by przeszukał tylko jeden system plików:

Opcja: -xdev
Opcja: -mount
Zakazuje wchodzenia do katalogów położonych na innych systemach plików. Te opcje to synonimy.

Drugi sposób to sprawdzanie dla każdego pliku typu systemu plików, na którym się on znajduje, i niezagłębianie się w katalogi, które leżą na systemach plików niepożądanego typu:

Test: -fstype typ
Prawdziwy, jeśli dany plik leży na systemie plików typu typ. Poprawne typy systemów są różne dla różnych wersji Uniksa. Oto niepełna lista typów systemów plików akceptowanych w takich czy innych wersjach Uniksa:
ufs 4.2 4.3 nfs tmp mfs S51K S52K

Typy systemów plików występujące w danym przypadku można zobaczyć stosując opcję `-printf' z dyrektywą `%F'. Zob. 3.2. Wypisanie informacji o pliku. W celu uniknięcia przeszukiwania zdalnych systemów plików `-fstype' jest zwykle używana z `-prune' (zob. 2.9. Katalogi).

2.11. Łączenie jednostek za pomocą operatorów

Operatory budują złożone wyrażenie z testów i akcji. Operatory to, w kolejności malejącego priorytetu:

( wyr )
Wymusza priorytet. Prawdziwe jeśli wyr jest prawdziwe.
! wyr
-not wyr
Prawdziwe jeśli wyr jest fałszywe.
wyr1 wyr2
wyr1 -a wyr2
wyr1 -and wyr2
Koniunkcja, AND. wyr2 nie jest wyliczane jeśli wyr1 jest fałszywe.
wyr1 -o wyr2
wyr1 -or wyr2
Alternatywa, OR. wyr2 nie jest wyliczane jeśli wyr1 jest prawdziwe.
wyr1 , wyr2
Lista. Oba wyrażenia: wyr1 i wyr2 są zawsze wyliczane. Prawdziwe, jeśli wyr2 jest prawdziwe. Wartość wyr1 jest odrzucana. Operator listy umożliwia wykonywanie wielu niezależnych operacji podczas jednego przeglądania, niezależnie od tego, czy pozostałe operacje się powiodły.

Dla każdej z nazw plików find przeszukuje drzewo katalogowe, zakorzenione w miejscu pliku, obliczając wyrażenie od lewej do prawej, zgodnie z regułami priorytetów, do chwili, gdy wynik jest już znany (lewa strona jest fałszywa dla `-and', bądź prawdziwa dla `-or'). Wówczas program przechodzi do następnej nazwy pliku.

Istnieją dwa inne testy, które mogą się przydać w złożonych wyrażeniach:

Test: -true
Zawsze prawdziwy.

Test: -false
Zawsze fałszywy.


Przejdź do pierwszej, poprzedniej, następnej, ostatniej sekcji, spisu treści.