NAZWA¶
find - szuka plików w hierarchii katalogowej
SKŁADNIA¶
find [
-H] [
-L] [
-P] [
-D
opcje-debugowania] [
-Opoziom]
[
ścieżka...] [
wyrażenie]
OPIS¶
Ta strona podręcznika man opisuje wersję GNU programu
find.
GNU
find przeszukuje drzewo katalogowe, zakorzenione w każdej z
podanych nazw plików. Wykonuje przy tym podane wyrażenie od
lewej do prawej, zgodnie z zasadami priorytetów (rozdział
OPERATORY), aż do ustalenia wyniku (lewa strona jest fałszywa
dla operacji
and, a prawdziwa dla
or), co powoduje
przejście do następnej nazwy pliku.
W przypadku używania
find w środowisku, w którym
istotne jest bezpieczeństwo (np. przy przeszukiwaniu katalogów,
które są zapisywalne dla innych użytkowników),
należy zapoznać się z rozdziałem "Security
Considerations" w dokumentacji findutils, pod nazwą
Finding
Files. Dokument ten (w języku angielskim) jest bardziej
szczegółowy i opisowy niż niniejsza strona
podręcznika systemowego, więc może okazać
się przydatniejszym źródłem informacji.
OPCJE¶
Opcje
-H,
-L i
-P kontrolują sposób
traktowania dowiązań symbolicznych. Kolejne argumenty wiersza
poleceń powinny być plikami lub katalogami do przeszukania,
aż do pierwszego argumentu rozpoczynającego się znakiem
"-" albo argumentu "(" lub "!". Argumenty te
(razem z następnymi) są rozpoznawane jako wyrażenie
opisujące to, co ma zostać przeszukane. Jeśli nie
zostanie podana ścieżka, użyty będzie
bieżący katalog. W przypadku braku wyrażenia,
używane jest domyślne wyrażenie
-print (lecz
wówczas i tak zapewne lepsze byłoby skorzystanie z
-print0).
Niniejsza strona podręcznika opisuje "opcje" w liście
wyrażeń. Opcje te kontrolują zachowanie
find, lecz
są podane zaraz za ostatnią nazwą
ścieżkową. Z kolei pięć
"prawdziwych" opcji (
-H,
-L,
-P,
-D i
-O) musi pojawić się przed ścieżką,
oczywiście jeśli okażą się potrzebne.
Podwójny dywiz
-- może posłużyć do
zasygnalizowania, że pozostałe argumenty nie są opcjami
(choć jeśli w liście punktów startowych
używa się masek, bezpieczniej jest zwykle poprzedzić je
wszystkie "./" lub "/").
- -P
- Nigdy nie podąża za dowiązaniami symbolicznymi. Jest
to zachowanie domyślne. Gdy find sprawdza lub wypisuje
informacje o pliku, a jest on dowiązaniem symbolicznym, to
użyta informacja powinna być wzięta z
właściwości samego dowiązania symbolicznego.
- -L
- Podąża za dowiązaniami symbolicznymi. Gdy find
sprawdza lub wypisuje informacje o plikach, to powinny być one
wzięte z właściwości pliku, na który
wskazuje dowiązanie symboliczne, a nie z samego dowiązania
(chyba, że jest to zerwane dowiązanie symboliczne lub
find nie może sprawdzić pliku, na który
wskazuje dowiązanie). Użycie tej opcji implikuje
-noleaf. Jeśli użyje się później
-P, to -noleaf wciąż będzie
działać. Jeśli działa -L, a find
podczas wyszukiwania odkryje dowiązanie symboliczne do podkatalogu,
to przeszukany zostanie podkatalog, na który wskazuje
dowiązanie.
- Gdy działa opcja -L, to wskazanie -type zawsze
będzie dopasowane w odniesieniu do typu pliku, na który
wskazuje dowiązanie, zamiast do samego dowiązania (chyba,
że jest ono zerwane). Użycie -L spowoduje, że
wskazanie -lname i -ilname zawsze zwróci
fałsz.
- -H
- Nie podąża za dowiązaniami symbolicznymi, z
wyjątkiem przetwarzania argumentów wiersza polecenia. Gdy
find sprawdza lub wypisuje informacje o plikach, powinny być
one brane z właściwości samego dowiązania
symbolicznego. Jedynym wyjątkiem jest sytuacja, gdy plik podany w
wierszu polecenia jest dowiązaniem symbolicznym i może
być ono rozwiązane. Wówczas informacja jest brana z
tego, na co wskazuje dowiązanie (tj. podąża
się za dowiązaniem). Informacja z samego dowiązania
jest używana w razie, gdy plik, na który wskazuje
dowiązanie nie może być sprawdzony. Gdy działa
-H i jedna ze ścieżek podanych w wierszu polecenia
jest dowiązaniem symbolicznym do katalogu, sprawdzana jest
zawartość tego katalogu (zapobiegnie temu skorzystanie z
-maxdepth 0).
Jeśli podano więcej niż jedną z opcji
-H,
-L i
-P, każda przesłania poprzednią -
liczy się ostatnia podana w wierszu polecenia, Ponieważ opcja
-P jest domyślna, powinno się ją uznać za
działającą, chyba że podano
-H lub
-L.
GNU
find często sprawdza status plików podczas
przetwarzania samego wiersza polecenia, przed rozpoczęciem
właściwego przeszukiwania. Opcje te mogą
również wpływać na sposób przetworzenia
argumentów. Co więcej, istnieje wiele testów,
które porównują pliki z wiersza polecenia do aktualnie
rozważanego pliku. W każdym przypadku, plik podany w wierszu
polecenia będzie sprawdzony i niektóre z jego
właściwości zostaną zachowane. Jeżeli
nazwany plik jest w rzeczywistości dowiązaniem symbolicznym, a
działa opcja
-P (lub nie podano
-H, ani
-L), to
informacja użyta do porównania zostanie wzięta z
właściwości dowiązania symbolicznego. W przeciwnym
razie, właściwości będą wzięte z
pliku, na który wskazuje dowiązanie. Jeżeli
find
nie może podążyć za dowiązaniem (np.
ponieważ ma niewystarczające uprawnienia lub dowiązanie
wskazuje na nieistniejący plik) zostaną użyte
właściwości samego dowiązania.
Gdy działa opcja
-H lub
-L, rozwiązywane są
wszystkie dowiązania symboliczne podane jako argument do opcji
-newer, a znaczniki czasowe będą wzięte z pliku,
na który wskazuje dowiązanie symboliczne. To samo dotczy opcji
-newerXY,
-anewer i
-cnewer.
Opcja
-follow ma podobne działanie do
-L, choć
działa tylko w miejscu pojawienia się (tj. jeśli
-L nie jest użyte, a skorzystano z
-follow, to wszystkie
dowiązania symboliczne pojawiające się w wierszu
poleceń za
-follow zostaną rozwiązane, lecz
umieszczone wcześniej - nie).
- -D opcje-debugowania
- Wyświetla informacje diagnostyczne - może okazać
się przydatna do zdiagnozowania przypadków, gdy find
nie robi tego czego od niego oczekujemy. Lista opcji debugowania powinna
być oddzielona przecinkami. Nie gwarantuje się
kompatybilności opcji debugowania pomiędzy wydaniami
findutils. Pełną listę prawidłowych opcji
debugowania wyświetli polecenie find -D help. Są to
między innymi:
- help
- Objaśnia opcje debugowania
- tree
- Wyświetla drzewko wyrażeń w formie oryginalnej i
zoptymalizowanej.
- stat
- Wyświetla komunikaty o plikach sprawdzanych przez wywołania
systemowe stat i lstat. Program find stara się
zminimalizować liczbę takich wywołań.
- opt
- Wyświetla informacje diagnostyczne związane z
optymalizację drzewka wyrażeń; patrz opcja
-O.
- rates
- Wyświetla podsumowanie wskazujące
częstość sukcesu lub porażki każdego
wskazania.
- -Opoziom
- Włącza optymalizację zapytań. Program
find zmienia kolejność testów, aby
przyspieszyć wykonanie przy zachowaniu efektu końcowego; tj.
nie zmienia się wskazań z efektami ubocznymi w stosunku do
każdego innego. Optymalizacje są przeprowadzane zgodnie z
poniższymi poziomami optymalizacji.
- 0
- Odpowiednik poziomu optymalizacji 1.
- 1
- Jest to domyślny poziom optymalizacji i odnosi się do
tradycyjnego zachowania. Kolejność wyrażeń
jest zmieniana w ten sposób, że testy
działające tylko na nazwach plików (np. -name
lub -regex) są wykonywane jako pierwsze.
- 2
- Testy -type lub -xtype są wykonywane po testach
działających tylko na nazwach plików, lecz przed
testami wymagającymi informacji z i-węzła. W wielu
współczesnych wersjach Uniksa, typy plików są
zwracane przez readdir(), a więc są szybsze do
sprawdzenia niż wskazówki, które wymagają
uprzedniego wykonania stat.
- 3
- Na tym poziomie optymalizacji, włączona jest pełna
optymalizacja, działająca w oparciu o koszt zapytań.
Kolejność testów jest modyfikowana w taki
sposób, aby tanie (szybkie) testy były przeprowadzane
wcześniej, a droższe - później, jeśli
to konieczne. Wewnątrz każdej grupy kosztowej, wskazania
są przeprowadzane wcześniej lub później,
zgodnie z prawdopodobieństwem ich powodzenia. Przy -o,
wskazania o większym prawdopodobieństwie sukcesu są
przeprowadzane wcześniej, a przy -a, wcześniej
wykonywane są wskazania o większym
prawdopodobieństwie niepowodzenia.
- Optymalizator działający w oparciu o koszty, ma z
góry przyjęte założenie o
prawdopodobieństwie powodzenia danego testu. W niektórych
przypadkach, prawdopodobieństwo bierze pod uwagę
naturę testu (np. -type f powinien kończyć
się sukcesem częściej niż -type c).
Optymalizator jest jeszcze w fazie kalkulacji. Jeśli nie poprawi to
wydajności programu find, zostanie ponownie usunięty.
Podobnie, optymalizacje, które udowodnią swą
rzetelność, spójność i
efektywność, mogą w przyszłości
zostać włączone na niższym poziomie
optymalizacyjnym. Jednak domyślne zachowanie (poziom optymalizacji
1) nie zmieni się w wydaniach 4.3.x. Zestaw testów findutils
wykonuje wszystkie testy find na każdym poziomie
optymalizacji, aby mieć pewność, że wyniki
pozostają te same.
WYRAŻENIA¶
Wyrażenie jest złożone z opcji (które tyczą
się raczej ogólnego działania, niż przetwarzania
konkretnego pliku i zawsze zwracają prawdę), testów
(które sprawdzają wartość prawdy lub
fałszu) i akcji (które mają efekty uboczne i
zwracają wartość prawdziwą lub
fałszywą); wszystkie te elementy są rozdzielone
operatorami.
-and jest domyślnym operatorem, przyjmowanym w
przypadku pominięcia go w jawnym zapisie.
Jeśli wyrażenie nie zawiera innych akcji niż
-prune,
to na wszystkich plikach, dla których jest ono prawdziwe, wykonywany
jest
-print.
OPCJE¶
Wszystkie opcje zawsze zwracają prawdę. Z wyjątkiem
-daystart,
-foolow i
-regextype, opcje
wpływają na wszystkie testy, w tym testy podane przed
opcją. Jest tak, ponieważ opcje są przetwarzane przy
parsowaniu wiersza polecenia, a testy nie są wykonywane, do czasu
działania na plikach. Opcje
-daystart,
-follow i
-regextype wyróżniają się pod tym
względem, ponieważ wpływają jedynie na testy
pojawiające się w wierszu polecenia za nimi. Z tego powodu,
najprzejrzyściej jest umieszczać je na początku
wyrażenia. Jeśli tak się nie stanie, wypisywane jest
ostrzeżenie.
- -d
- Synonim -depth, ze względu na kompatybilność z
FreeBSD, NetBSD, MacOS X i OpenBSD.
- -daystart
- Mierzy czasy (dla -amin, -atime, -cmin,
-ctime, -mmin i -mtime) od dziś, a nie od 24
godzin temu. Opcja ta wpływa jedynie na testy, pojawiające
się później w wierszu polecenia.
- -depth
- Przetwarza zawartość każdego katalogu przed samym
katalogiem jako takim. Akcja -delete implikuje także
-depth.
- -follow
- Przestarzałe, proszę zamiast tego użyć opcji
-L. Rozwiązuje dowiązania symboliczne. Implikuje
-noleaf. Opcja -foolow działa jedynie na testy
pojawiające się w wierszu polecenia za nią. O ile nie
poda się opcji -H lub -L, pozycja opcji
-follow zmienia zachowanie wskazania -newer - pliki
będące argumentami -newer zostaną
rozwiązane, jeśli są dowiązaniami
symbolicznymi. To samo dotyczy opcji -newerXY,
-anewer and -cnewer. Podobnie, wskazanie -type
zostanie zawsze dopasowane do pliku wskazanego przez dowiązanie
symboliczne, zamiast do samego dowiązania. Użycie
-follow powoduje, że wskazania -lname i
-ilname zawsze zwracają fałsz.
- -help, --help
- Wypisuje sposób użycia find z wiersza poleceń
i kończy pracę programu.
- -ignore_readdir_race
- Zwykle find wyświetla błąd, gdy nie uda mu
się pobrać statusu pliku. Po podaniu tej opcji i
usunięciu pliku pomiędzy odczytem przez find nazwy
pliku z katalogu i momentem próby pobrania statusu,
błąd nie zostanie wyświetlony. Dotyczy to
również plików i katalogów podanych w wierszu
polecenia. Opcja ta zaczyna działać już przy odczycie
wiersza polecenia, co oznacza, że nie da się
przeszukiwać systemu plików częściowo z
opcją włączoną i częściowo z
wyłączoną (aby to zrobić, konieczne jest
dwukrotne uruchomienie polecenia find, jeden raz z opcją
włączoną, a drugi - z
wyłączoną).
- -maxdepth głębokość
- Schodzi maksymalnie o głębokość
(nieujemna liczba całkowita) poziomów katalogów od
argumentów wiersza poleceń. -maxdepth 0 oznacza, by
testy i akcje stosować tylko do argumentów wiersza
poleceń.
- -mindepth głębokość
- Nie stosuje testów lub akcji w poziomach niższych niż
głębokość (nieujemna liczba
całkowita). mindepth 1 oznacza przetwarzanie wszystkich
plików poza argumentami wiersza poleceń.
- -mount
- Nie zagłębia się w katalogi na innych systemach
plików. Jest to alternatywna nazwa dla -xdev, stworzona dla
zgodności z innymi wersjami find.
- -noignore_readdir_race
- Wyłącza efekt opcji -ignore_readdir_race.
- -noleaf
- Zakazuje optymalizacji wykonywanej przez zakładanie, że
katalogi zawierają o dwa podkatalogi mniej niż ich licznik
dowiązań zwykłych (twardych). Opcja ta jest wymagana
podczas przeszukiwania systemów plików, które nie
używają uniksowej konwencji wiązania
katalogów, takich jak systemy plików CD-ROM, MS-DOS czy
wolumeny AFS. Każdy katalog w normalnym systemie uniksowym zawiera
przynajmniej dwa twarde dowiązania: jego nazwę i
".". Dodatkowo, jego podkatalogi będą do niego
dowiązane za pomocą ".." każdy. Gdy
find testuje katalog po zbadaniu funkcją stat o 2 mniej
podkatalogów niż licznik dowiązań, wie,
że reszta wpisów jest niekatalogowa (są to
"liście" - "leaf" w drzewie katalogów).
Jeśli testowane mają być tylko nazwy plików,
to nie ma potrzeby ich sprawdzać; daje to znaczące
przyspieszenie.
- -regextype typ
- Zmienia składnię wyrażeń regularnych
rozumianych przez testy -regex i -iregex podane
później w wierszu poleceń. Obecnie zaimplementowanymi
typami są: emacs (domyślny), posix-awk,
posix-basix, posix-egrep i posix-extended.
- -version, --version
- Wypisuje wersję i kończy pracę.
- -warn, -nowarn
- Odpowiednio: włącza lub wyłącza
ostrzeżenia. Odnoszą się one wyłącznie
do użycia wiersza poleceń, a nie do warunków
zastanych przez find podczas przeszukiwania katalogów.
Domyślne zachowanie odpowiada -warn gdy standardowym
wejściem jest tty i -nowarn w przeciwnym wypadku.
- -xdev
- Nie zagłębia się w katalogi na innych systemach
plików.
TESTY¶
Niektóre testy np.
-newerXY i
-samefile
pozwalają na porównanie pomiędzy aktualnie sprawdzanym
plikiem i plikiem odniesienia podanym w wierszu polecenia. Gdy te testy
są używane, interpretacja pliku odniesienia zależy od
opcji
-H,
-L i
-P i podanej wcześniej
-follow, lecz plik odniesienia jest sprawdzany tylko raz, przy
przetwarzaniu wiersza polecenia. Jeśli plik odniesienia nie może
zostać sprawdzony (np. wywołanie systemowe
stat(2) nie
powiedzie się na nim), wyświetlany jest błąd, a
find wychodzi z niezerowym kodem zakończenia.
Wartości numeryczne mogą być podawane jako
- +n
- dla większych niż n,
- -n
- dla mniejszych niż n,
- n
- dla równych n.
- -amin n
- Dostęp do pliku nastąpił ostatnio n minut
temu.
- -anewer plik
- Do pliku ostatnio dostano się wcześniej niż
plik został zmodyfikowany. Jeśli plik jest
dowiązaniem i działa jedna z opcji -L lub -H,
to używany jest zawsze czas dostępu pliku, na który
wskazuje dowiązanie.
- -atime n
- Dostęp do pliku miał miejsce n*24 godzin temu. Gdy
find dowie się jak wiele okresów 24-godzinnych temu dostano
się do pliku, ignorowana jest część
ułamkowa; tak więc aby dopasować -atime +1,
dostęp do pliku musiał być co najwyżej
dwa dni temu.
- -cmin n
- Status pliku został zmieniony n minut temu.
- -cnewer plik
- Status pliku był ostatnio zmieniony wcześniej niż
zmodyfikowano plik. Jeśli plik jest
dowiązaniem i działa jedna z opcji -L lub -H,
to używany jest zawsze czas modyfikacji pliku, na który
wskazuje dowiązanie.
- -ctime n
- Status pliku został zmieniony n*24 godzin temu.
Proszę zapoznać się z komentarzami do -atime,
aby zrozumieć wpływ zaokrąglenia na
interpretację czasu modyfikacji pliku.
- -empty
- Plik jest pusty i jest albo zwykłym plikiem, albo katalogiem.
- -executable
- Dopasowuje pliki wykonywalne i katalogi przeszukiwalne (w sensie
tłumaczenia nazw pliku). Bierze pod uwagę listy kontroli
dostępu (ACL) i inne zasady praw dostępu, które
są ignorowane przez test -perm. Ten test używa
wywołania systemowego access(2) i może być
zmylony przez serwery NFS używające mapowania UID (lub
root-squashing), gdyż wiele systemów implementuje
access(2) w jądrze klienta i nie może
użyć informacji mapowania UID po stronie serwera.
Ponieważ test ten działa tylko w oparciu o wywołanie
systemowe access(2), nie ma gwarancji, że plik dla
którego test się powiódł, może
być w rzeczywistości wykonany.
- -false
- Zawsze fałszywe.
- -fstype typ
- Plik jest na systemie plików o typie typ. Prawidłowe
typy systemów plików różnią się
na różnych wersjach Uniksa; ich niekompletna lista,
która jest przyjmowana w części systemów to:
ufs, 4.2, 4.3, nfs, tmp, mfs,
S51K, S52K. Aby zobaczyć typy swoich systemów
plików, należy użyć -printf z dyrektywą
%F.
- -gid n
- Numeryczny GID pliku to n.
- -group nazwag
- Plik należy do grupy nazwag (numeryczny GID jest
dopuszczalny).
- -ilname wzorzec
- Podobnie jak -lname, lecz dopasowanie jest niezależne od
wielkości znaków. Jeśli działa opcja -L
lub -follow, test zwraca fałsz, chyba że
dowiązanie symboliczne jest zerwane.
- -iname pattern
- Podobnie jak -name, lecz dopasowanie jest niezależne od
wielkości znaków. Na przykład wzorce "fo*"
i "F??" dopasują nazwy plików "Foo",
"FOO", "foo", "fOo", itp. W tych wzorcach, w
przeciwieństwie do uzupełniania nazw plików przez
powłokę, początkowe "." może
być dopasowane za pomocą "*" tzn. find -name
*bar dopasuje plik ".foobar". Proszę
zwrócić uwagę, że wzorce należy
zacytować, ponieważ w przeciwnym wypadku maski
zostaną zinterpretowane przez powłokę.
- -inum n
- Plik ma numer i-węzła n. Zwykle łatwiej jest
użyć testu -samefile.
- -ipath wzorzec
- Zachowuje się w ten sam sposób, co -iwholename. Opcja
jest przestarzała, więc proszę jej nie
używać.
- -iregex wzorzec
- Podobne do -regex, lecz dopasowanie jest niewrażliwe na
rozmiar liter.
- -ilname pattern
- Podobne do -wholename, lecz dopasowania są
niewrażliwe na rozmiar liter.
- -links n
- Plik ma n dowiązań.
- -lname wzorzec
- Plik jest dowiązaniem symbolicznym, którego
zawartość odpowiada wzorcowi powłoki wzorzec.
Metaznaki nie traktują specjalnie "/" i ".".
Jeśli działa opcja -L lub -follow, to test
zwraca fałsz, chyba że dowiązanie symboliczne jest
zerwane.
- -mmin n
- Dane pliku były ostatnio modyfikowane n minut temu.
- -mtime n
- Dane pliku zostały ostatnio zmodyfikowane n*24 godziny temu.
Proszę zapoznać się komentarzami do opcji
-atime, aby zrozumieć, w jaki sposób
zaokrąglanie wpływa na interpretację czasów
modyfikacji pliku.
- -name wzorzec
- Część bazowa nazwy pliku (ścieżka bez
początkowych katalogów) dopasowuje wzorzec powłoki
wzorzec. Metaznaki ("*", "?" i "[]")
dopasowują "." na początku nazwy bazowej
(wprowadzono to w findutils-4.2.2; patrz rozdział
ZGODNOŚĆ ZE STANDARDAMI). Nawiasy klamrowe nie są
rozpoznawane jako specjalne, niezależnie od faktu, że
niektóre powłoki, w tym Bash, nadają mu specjalne
znaczenie we wzorcach powłoki. Dopasowanie nazwy pliku jest
przeprowadzane za pomocą funkcji bibliotecznej fnmatch(3).
Proszę nie zapomnieć ująć wzorca w
cudzysłowy, aby zapobiec interpretacji go przez
powłokę.
- -newer plik
- Plik został zmodyfikowany później niż
plik. Jeśli plik jest dowiązaniem symbolicznym
i działają opcje -H lub -L, to używany
jest zawsze czas modyfikacji pliku, na który wskazuje
dowiązanie.
- -newerXY odniesienie
- Porównuje znacznik czasowy bieżącego pliku z
odniesieniem. Argument odniesienie jest zwykle nazwą
pliku (i jeden z jego znaczników jest użyty do
porównania), lecz może być to również
łańcuch, opisujący czas bezwzględny. X
i Y mają być zastąpione innymi literami,
które wybierają który czas pliku ( X) i
odniesienia ( Y) jest używany do porównania.
a |
Czas dostępu (ang. access) pliku odniesienie |
B |
Czas powstania (ang. birth) pliku odniesienie |
c |
Czas zmiany (ang. change) statusu i-węzła
odniesienia |
m |
Czas modyfikacji pliku odniesienie |
t |
odniesienie jest interpr. bezpośrednio jako czas (ang.
time) |
Niektóre kombinacje są nieprawidłowe, np. X nie
może być t. Część kombinacji nie
jest zaimplementowanych we wszystkich systemach, do takich należy
np. B. Jeśli poda się nieprawidłową lub
nieobsługiwaną kombinację XY, otrzymuje
się błąd krytyczny. Określenia czasowe
są interpretowane jak argument do opcji -d GNU date.
Jeżeli czas powstania pliku odniesienia nie może być
ustalony, to przy próbie użycia go wynikiem jest komunikat o
błędzie krytycznym. Jeśli poda się test,
odnoszący się do czasu powstania sprawdzanych plików,
to test ten nie powiedzie się dla wszystkich plików,
których czas ten jest nieznany.
- -nogroup
- Do numerycznego GID pliku nie pasuje żadna grupa.
- -nouser
- Do numerycznego UID pliku nie pasuje żaden użytkownik.
- -path wzorzec
- Nazwa pliku odpowiada wzorcowi powłoki wzorzec. Metaznaki
nie traktują specjalnie "/" lub "."; tak
więc na przykład,
find . -path "./sr*sc"
wypisze wpis katalogowy o nazwie "./src/misc" (jeśli taki
istnieje). Aby zignorować całe drzewo katalogowe,
proszę użyć -prune, zamiast sprawdzać
każdy plik w drzewie. Na przykład, aby pominąć
katalog "src/emacs" i wszystkie jego pliki i katalogi oraz
wypisać nazwy innych znalezionych plików, proszę
użyć:
find . -path ./src/emacs -prune -o -print
Proszę zauważyć, że test dopasowuje wzorzec do
całej nazwy pliku, poczynając od punktu początkowego,
podanego w wierszu polecenie. Jeśli punkt startowy jest
ścieżką absolutną, sens ma zastosowanie
również wyłącznie ścieżki
absolutnej. Oznacza to, że poniższe polecenie nigdy niczego
nie dopasuje.
find bar -path /foo/bar/myfile -print
Wskazanie -path jest obsługiwane również przez
find HP-UX i zostanie uwzględnione w kolejnej wersji
standardu POSIX.
- -perm prawa
- Bity praw pliku są dokładnie takie, jak prawa (w
formie ósemkowej lub symbolicznej). Ponieważ wymagane jest
dokładne dopasowanie, stosowanie tej formuły w postaci
symbolicznej wymaga podania dość skomplikowanego
łańcucha praw. Na przykład -perm g=w dopasuje
jedynie pliki o trybie 0020 (tj. te, których prawo zapisu dla grupy
jest jedynym ustawionych uprawnieniem). Prawdopodobnie w takim przypadku
lepsze jest użycie form "/" lub "-", np.
-perm -g=w, które dopasowuje każdy plik z prawem
zapisu dla grupy. Lepsze przykłady podano w rozdziale
PRZYKŁADY.
- -perm -prawa
- Wszystkie bity praw pliku są ustawione dla pliku.
Akceptowane są tryby w postaci symbolicznej i jest to zwykle
wygodniejsza forma do użycia. W przypadku korzystania z postaci
symbolicznej trzeba podać "u", "g" lub
"o". Lepsze przykłady podano w rozdziale
PRZYKŁADY.
- -perm /prawa
- Ustawiony jest dowolny z bitów praw pliku. Akceptowane
są tryby w postaci symbolicznej. W przypadku korzystania z postaci
symbolicznej trzeba podać "u", "g" lub
"o". Lepsze przykłady podano w rozdziale
PRZYKŁADY. Jeśli nie ustawiono bitów praw w
trybie, to test dopasuje każdy plik (zgodnie z
zamysłem, aby pozostać w zgodzie z zachowaniem -perm
-000).
- -perm +prawa
- Przestarzałe, stara metoda szukania plików z bitami
uprawnień zgodnymi z prawami. Obecnie należy
używać -perm /prawa. Próba
użycia + w składni z postacią
symboliczną, da zaskakujące wyniki. Przykładowo,
"+u+x" jest prawidłowym trybem symbolicznym
(odpowiednikiem +u,+x np. 0111) i nie zostanie przetłumaczony na
-perm +prawa, lecz na dokładne określenie praw
-perm prawa, dopasowane zostaną więc jedynie
plik o uprawnieniach dokładnie 0111, zamiast wszystkich
plików z bitem wykonywalności. Jeśli akapit ten nie
jest jasny, to nic dziwnego - proszę używać po prostu
-perm /tryb. Ta postać testu -perm jest
przestarzała, ponieważ POSIX wymaga interpretacji
początkowego "+" jako części postaci
symbolicznej - dlatego właśnie obecnie korzystamy z
"/".
- -readable
- Dopasowuje odczytywalne pliki. Bierze się tu pod uwagę listy
kontroli dostępu (ACL) i inne sprawy związane z
uprawnieniami, które -perm ignoruje. Ten test używa
wywołania systemowego access(2) i może być
zmylony przez serwery NFS używające mapowania UID (lub
root-squashing), gdyż wiele systemów implementuje
access(2) w jądrze klienta i nie może
użyć informacji mapowania UID po stronie serwera.
- -regex wzorzec
- Nazwa pliku odpowiada wyrażeniu regularnemu wzorzec.
Dopasowanie stosuje się do całej ścieżki, nie
dla przeszukiwanej. Na przykład, aby dopasować plik o nazwie
"./fubar3", można użyć wyrażenia
regularnego ".*bar" lub ".*b.*3", lecz nie
"f.*r3". Wyrażenia regularne rozumiane przez find
są domyślnie wyrażeniami regularnymi Emacsa, lecz
można to zmienić opcją -regextype.
- -samefile nazwa
- Plik odnosi się do tego samego i-węzła co
nazwa. Gdy działa opcja -L, obejmuje to
dowiązania symboliczne.
- -size
n[c|w|b|k|M|G]
- Plik używa n jednostek miejsca. Można dodać
następujące przyrostki:
- b
- bloki 512-bajtowe (wartość domyślna, gdy nie
użyto przyrostka)
- c
- bajty
- w
- słowa dwubajtowe
- k
- kilobajty (1024 bajtów)
- M
- megabajty (1048576 bajtów)
- G
- gigabajty (1073741824 bajtów)
- Rozmiar nie obejmuje bloków pośrednich, lecz wlicza bloki w
tzw. plikach rzadkich, które nie są w rzeczywistości
zaalokowane. Proszę pamiętać, że
określenia formatu "%k" i "%b" akcji
-printf obsługują pliki rzadkie w inny sposób.
Przyrostek "b" oznacza zawsze bloki 512-bajtowe, a nigdy nie
jednokilobajtowe, co różni się od zachowania
-ls.
- -true
- Zawsze prawda.
- -type c
- Plik jest typu c:
- b
- blokowy (buforowany) plik specjalny
- c
- znakowy (niebuforowany) plik specjalny (ang. character)
- d
- katalog (ang. directory)
- p
- łącze nazwane (FIFO, ang. pipe)
- f
- zwykły plik (ang. file)
- l
- dowiązanie symboliczne (link); nigdy nie jest to prawda, gdy
działa opcja -L lub -foolow, chyba że
dowiązanie jest zerwane. Aby wyszukiwać dowiązania
symboliczne przy korzystaniu z opcji -L, należy
użyć -xtype.
- s
- gniazdo (ang. socket)
- D
- door (Solaris)
- -uid n
- Numeryczny UID pliku to n.
- -used n
- Do pliku ostatnio dostano się n dni po zmianie jego statusu.
- -user unazwa
- Właścicielem pliku jest użytkownik unazwa
(numeryczny UID jest tu dozwolony).
- -wholename wzorzec
- Patrz -path. Ta alternatywa jest mniej przenośna niż
wspomniana opcja.
- -writable
- Dopasowuje zapisywalne pliki. Bierze pod uwagę listy kontroli
dostępu (ACL) i inne zasady praw dostępu, które
są ignorowane przez test -perm. Ten test używa
wywołania systemowego access(2) i może być
zmylony przez serwery NFS używające mapowania UID (lub
root-squashing), gdyż wiele systemów implementuje
access(2) w jądrze klienta i nie może
użyć informacji mapowania UID po stronie serwera.
- -xtype c
- Jest to to samo co -type, chyba że plik jest
dowiązaniem symbolicznym. Dla dowiązań symbolicznych:
jeśli podano -H lub -P, jest prawdziwe gdy plik jest
dowiązaniem do pliku typu c; jeśli podano -L,
jest prawdziwe, jeśli c to "l". Innymi
słowy, dla dowiązań symbolicznych -xtype
sprawdza typ pliku, którego nie sprawdza -type.
AKCJE¶
- -delete
- Usuwa pliki; prawdziwe gdy usunięcie powiedzie się.
Jeśli nie, to wypisywany jest błąd. Jeśli
-delete zawiedzie, kod zakończenia find będzie
niezerowy (gdy program ostatecznie się zakończy).
Użycie -delete automatycznie włącza
opcję -depth.
Ostrzeżenie: Proszę nie zapomnieć, że
wiersz poleceń find jest wykonywany jako wyrażenie,
więc umieszczenie -delete jako pierwszego spowoduje
próbę usunięcie wszystkiego poniżej podanych
punktów początkowych. Podczas testowania wiersza polecenia
find, którą chce się później
użyć z -delete, proszę podać
bezpośrednio -depth, aby uniknąć
późniejszych niespodzianek. Ponieważ -delete
implikuje -depth, to nie da się użyć
-prune i -delete w sposób przydatny.
- -exec polecenie ;
- Wykonuje polecenie; prawdziwe jeśli zwrócony
został status 0. Wszelkie następne argumenty find
są brane za argumenty polecenia, aż nie zostanie napotkany
argument, składający się z ";".
Łańcuch "{}' jest podmieniany na obecnie
przetwarzaną nazwę pliku, wszędzie, gdzie
wystąpi ona w wierszu polecenia, nie tylko w argumentach, gdzie
jest ona sama, jak w niektórych wersjach find. Obydwie te
konstrukcje być może będą wymagały
zacytowania (znakiem "\") aby uchronić je przed
rozwinięciem przez powłokę. Więcej informacji
na temat użycia opcji -exec, zawiera rozdział
PRZYKŁADY. Polecenie jest wykonywane w katalogu startowym. W
związku z akcją -exec występują pewne
nieuniknione zagrożenia związane z bezpieczeństwem,
należy zamiast niej używać -execdir.
- -exec polecenie {} +
- Ten wariant akcji -exec, wykonuje podane polecenie na wybranych
plikach, lecz wiersz polecenia jest budowany przez dodawanie każdej
wybranej nazwy pliku na końcu - całkowita liczba
wywołań polecenia będzie znacznie mniejsza,
niż liczba dopasowanych plików. Wiersz polecenia jest
budowany w ten sam sposób, w jaki xargs buduje swój.
W poleceniu dozwolone jest wystąpienie jedynie jednych
nawiasów "{}". Polecenie jest wykonywane w katalogu
początkowym.
- -execdir polecenie ;
- -execdir polecenie {} +
- Podobnie jak -exec, lecz podane polecenie jest uruchamiane z
podkatalogu zawierającego dopasowany plik, który nie jest
zwykle tożsamy z katalogiem, w którym uruchomiono
find. Jest to o wiele bezpieczniejsza metoda wywoływania
poleceń, ponieważ zapobiega wyścigowi przy
rozwiązywaniu ścieżek do dopasowanych plików.
Podobnie jak przy akcji -exec, postać z "+"
-execdir zbuduje wiersz poleceń aby przetworzyć
więcej niż jeden dopasowany plik, lecz każde dane
wywołanie polecenia wypisze jedynie pliki, które
istnieją w tym samym podkatalogu. Przy używaniu tej opcji,
trzeba się upewnić, że zmienna środowiskowa
$PATH nie odnosi się do "." - w takim wypadku
atakujący mógłby uruchomić dowolne polecenie,
przez pozostawienie pliku o odpowiedniej nazwie w katalogu, w
którym zostanie uruchomione -execdir. To samo tyczy
się wpisów w $PATH, które są puste lub
nie są bezwzględną nazwą katalogu.
- -fls plik
- Prawda; podobne do -ls, lecz zapisuje do pliku jak
-fprint. Plik wyjściowy jest tworzony zawsze, nawet
jeśli wskazanie nigdy nie pasuje. W rozdziale NIETYPOWE NAZWY
PLIKÓW znajdują się informacje nt. obsługi
nietypowych nazw plików.
- -fprint plik
- Prawdziwe; wypisuje pełną nazwę pliku do
pliku. Jeśli plik nie istnieje w czasie
działania find, zostanie utworzony; jeśli istnieje,
zostanie obcięty. Nazwy plików "/dev/stdout" i
"/dev/stderr" są traktowane osobno; odnoszą
się one odpowiednio do standardowego wyjścia i standardowego
wyjścia błędów. Plik wyjściowy jest
tworzony zawsze, nawet jeśli wskazanie nigdy nie pasuje. W
rozdziale NIETYPOWE NAZWY PLIKÓW znajdują się
informacje nt. obsługi nietypowych nazw plików.
- -fprint0 plik
- Prawda; podobne do -print0, lecz zapisuje do pliku jak
-fprint. Plik wyjściowy jest tworzony zawsze, nawet
jeśli wskazanie nigdy nie pasuje. W rozdziale NIETYPOWE NAZWY
PLIKÓW znajdują się informacje nt. obsługi
nietypowych nazw plików.
- -fprintf plik format
- Prawda; podobne do -printf, lecz zapisuje do pliku jak
-fprint. Plik wyjściowy jest tworzony zawsze, nawet
jeśli wskazanie nigdy nie pasuje. W rozdziale NIETYPOWE NAZWY
PLIKÓW znajdują się informacje nt. obsługi
nietypowych nazw plików.
- -ls
- Prawdziwe; wypisuje plik bieżący w formacie ls -dils
na standardowe wyjście. Liczniki bloków są 1K
blokami, chyba że ustawiono zmienną
środowiskową POSIXLY_CORRECT, kiedy używane
będą 512-bajtowe bloki. W rozdziale NIETYPOWE NAZWY
PLIKÓW znajdują się informacje nt. obsługi
nietypowych nazw plików.
- -ok polecenie ;
- Jak -exec, lecz najpierw pyta użytkownika. Jeśli
się on zgodzi - uruchamia polecenie. W przeciwnym wypadku jedynie
zwraca fałsz. Gdy polecenie jest uruchomione, standardowe
wejście jest przekierowane z /dev/null.
- Odpowiedź na pytanie jest dopasowywane do pary
wyrażeń regularnych, aby określić, czy jest
pozytywna czy negatywna. Wyrażenie to jest pozyskiwane z systemu,
jeśli ustawiona jest zmienna środowiskowa
POSIXLY_CORRECT, a w przeciwnym wypadku - z katalogu
tłumaczeń komunikatów find. Jeśli
system nie posiada odpowiednich definicji, użyta będzie
własna definicja finda. W każdym przypadku,
interpretacja wyrażenia regularnego będzie
zależała od zmiennej środowiskowej
"LC_CTYPE" (klasy znakowe) i "LC_COLLATE"
(przedziały znaków i klasy
równoważności).
- -okdir polecenie ;
- Jak -execdir, lecz najpierw wyświetlane jest pytanie,
podobnie jak przy -ok. Jeśli użytkownik nie zgodzi
się, zwraca jedynie fałsz. Gdy polecenie jest uruchomione,
jego standardowe wejście jest przekierowane z /dev/null.
- -print
- Prawdziwe; wypisuje pełną nazwę pliku na standardowe
wyjście razem ze znakiem nowego wiersza. Jeśli
wyjście finda jest przekierowane za pomocą potoku do
innego programu i istnieje choć najmniejsza
możliwość, że nazwa jednego z przeszukiwanych
plików może zawierać znak nowego wiersza,
należy się poważnie zastanowić, czy lepszym
wyjściem nie będzie skorzystanie z opcji -print0,
zamiast -print. Rozdział NIETYPOWE NAZWY
PLIKÓW zawiera informacje nt. obsługi nietypowych
znaków.
- -print0
- Prawdziwe; wypisje pełną nazwę pliku na standardowe
wyjście. Za nazwą daje znak null (zamiast znaku nowego
wiersza używanego przez -print. Umożliwia to poprawne
wyświetlenie plików, zawierających w nazwach znaki
nowej linii w programach, przetwarzających wyjście
finda. Opcja ta odpowiada opcji -0 programu xargs.
- -printf format
- Prawdziwe; wypisuje format na standardowe wyjście,
interpretując sekwencje specjalne "\" i dyrektywy
"%". Szerokości pól i precyzje mogą
być podawane dokładnie jak w funkcji "printf" z C.
Proszę zauważyć, że wiele z pól jest
wypisywanych jako %s, a nie jako %d - może to oznaczać,
że flagi nie będą działać zgodnie z
oczekiwaniami. Oznacza to również, że flaga
"-" działa (wymusza wyrównanie do lewej
pól). W przeciwieństwie do -print, -printf nie
dodaje znaku nowego wiersza do końca łańcucha.
Sekwencje specjalne i dyrektywy to:
- \a
- Dzwonek.
- \b
- Backspace.
- \c
- Wstrzymuje wypisywanie tego formatu i natychmiast wymiata
wyjście.
- \f
- Wysuw wiersza.
- \n
- Nowy wiersz.
- \r
- Powrót karetki.
- \t
- Tabulacja pozioma.
- \v
- Tabulacja pionowa.
- \0
- ASCII NUL.
- \\
- Literalny lewy ukośnik ("\").
- \NNN
- Znak o kodzie ASCII NNN (ósemkowo).
"\", za którym następuje dowolny inny znak, jest
traktowany jak zwykły znak, więc są wypisywane obydwa.
- %%
- Literalny znak procenta.
- %a
- Ostatni czas dostępu do pliku w formacie zwracanym przez
funkcję "ctime" C.
- %Ak
- Ostatni czas dostępu do pliku, w formacie określonym przez
k, którym może być "@", lub
dyrektywa dla funkcji C "strftime". Możliwe
wartości k są wymienione niżej;
niektóre z nich mogą nie być dostępne na
wszystkich systemach z powodu różnic w "strftime"
między systemami.
- @
- Sekundy od 1 stycznia, 1970, 00:00 GMT, z częścią
ułamkową.
Pola czasowe:
- H
- godzina (00..23)
- I
- godzina (01..12)
- k
- godzina ( 0..23)
- l
- godzina ( 1..12)
- M
- minuta (00..59)
- p
- przetłumaczone AM lub PM
- r
- czas, 12-godzinny (gg:mm:ss)
- S
- Sekundy (00.00 .. 61.00). Jest tu część
ułamkowa.
- T
- czas, 24-godzinny (gg:mm:ss)
- +
- Data i czas, oddzielona "+" np
"2004-04-28+22:22:05.0". Jest to rozszerzenie GNU. Czas jest
podany w bieżącej strefie czasowej (na którą
wpływ może mieć ustawiona zmienna środowiskowa
TZ). Pole sekundowe zawiera część
ułamkową.
- X
- lokalna reprezentacja czasu (G:M:S)
- Z
- strefa czasowa (np. EDT), lub nic jeśli nie da się jej
określić
Pola daty:
- a
- lokalny skrót nazwy tygodnia (nie..sob)
- A
- lokalna pełna nazwa tygodnia, zmiennej długości
(niedziela..sobota)
- b
- lokalna skrócona nazwa miesiąca (sty..gru)
- B
- lokalna pełna nazwa miesiąca, zmiennej
długości (styczeń..grudzień)
- c
- data i czas zgodnie z ustawieniami regionalnymi (sob, 4 lis 1989,
12:02:33). Format ten jest taki sam w przypadku ctime(3) i w celu
zachowania z nim kompatybilności, nie ma tu części
ułamkowej w polu sekund.
- d
- dzień miesiąca (01..31)
- D
- data (mm/dd/rr)
- h
- to samo co b
- j
- dzień roku (001..366)
- m
- miesiąc (01..12)
- U
- numer tygodnia w roku, z niedzielą liczoną jako pierwszy
dzień tygodnia (00..53)
- w
- dzień tygodnia (0..6)
- W
- numer tygodnia w roku, licząc z poniedziałkiem, jako
pierwszym dniem tygodnia (00..53)
- x
- lokalna reprezentacja daty (mm.dd.rrrr)
- y
- ostatnie dwie cyfry roku (00..99)
- Y
- rok (1970...)
- %b
- Wielkość przestrzeni dysku, użyta dla tego pliku w
blokach 512-bajtowych. Ponieważ przestrzeń dyskowa jest
alokowana w wielokrotnościach rozmiaru bloku systemu plików,
jest to zwykle więcej niż %s/512, lecz może
być to również mniej, gdy plik jest tzw. plikiem
rzadkim.
- %c
- Ostatni czas zmiany statusu pliku, w formacie zwróconym przez
funkcję "ctime" z C.
- %Ck
- Ostatni czas zmiany statusu pliku w formacie określonym przez
k, w taki sam sposób, jak dla %A.
- %d
- Głębokość pliku w drzewie katalogowym; 0
oznacza plik w argumencie wiersza poleceń.
- %D
- Numer urządzenia, na którym istnieje plik (pole st_dev ze
stat struct), dziesiętnie.
- %f
- Nazwa pliku z usuniętymi początkowymi katalogami (tylko
ostatni element nazwy).
- %F
- Rodzaj systemu plików, na którym znajduje się plik;
wartość ta może być używana do
-fstype.
- %g
- Nazwa grupy pliku lub numeryczny GID, jeśli grupa nie ma
nazwy.
- %G
- Numeryczny GID pliku.
- %h
- Początkowe katalogi z nazwy pliku (wszystkie, poza ostatnim
elementem). Jeśli nazwa pliku nie zawiera ukośników
(ponieważ jest to katalog bieżący), to %h daje
".".
- %H
- Argument wiersza poleceń, pod którym plik został
znaleziony.
- %i
- Numer i-węzła pliku (dziesiętnie).
- %k
- Wielkość przestrzeni dysku, użyta dla tego pliku w
blokach o wielkości 1K bajtów. Ponieważ
przestrzeń dyskowa jest alokowana w wielokrotnościach
rozmiaru bloku systemu plików, jest to zwykle więcej
niż %s/1024, lecz może być to również
mniej, gdy plik jest tzw. plikiem rzadkim.
- %l
- Obiekt dowiązania symbolicznego (pusty łańcuch,
jeśli plik nie jest dowiązaniem symbolicznym).
- %m
- Bity praw pliku (ósemkowo). Ta opcja korzysta z
"tradycyjnych" liczb, używanych przez
większość implementacji Uniksowych, lecz jeśli
dana, używana obecnie implementacja, wykorzystuje dziwną
kolejność ósemkowych bitów uprawnień,
widoczna będzie różnica pomiędzy prawami pliku
i wynikiem %m. Zwykle chce się tu użyć
początkowego zera i aby to zrobić należy
skorzystać z flagi # (np. "%#m")
- %M
- Uprawnienia pliku (w postaci symbolicznej, jak w ls). Ta dyrektywa
jest obsługiwana przez findutils 4.2.5 i
późniejsze.
- %n
- Liczba twardych dowiązań do pliku.
- %p
- Nazwa pliku.
- %P
- Nazwa pliku z usuniętą z początku nazwą
argumentu wiersza poleceń, dla którego ją
znaleziono.
- %s
- Rozmiar pliku w bajtach.
- %S
- Rzadkość (dziurawość) pliku. Jest obliczana
jako (ROZMIARBLOKU*st_blocks / st_size). Dokładna
wartość, jaką uzyska się dla danego
zwykłego pliku o określonej wielkości, jest
zależna od systemu. Jednak pliki rzadkie będą
miały tę wartość zwykle mniejszą
niż 1.0, a pliki używające bloków
pośrednich mogą mieć wartość
większą niż 1.0. Wartość użyta
dla ROZMIARBLOKU zależy od systemu, lecz najczęściej
jest to 512. Jeśli rozmiar bloku wynosi zero, wypisywana
wartość jest niezdefiniowana. W systemach
nieobsługujących st_blocks, rzadkość pliku
przyjmuje się na 1.0.
- %t
- Ostatni czas modyfikacji pliku w formacie zwróconym przez
funkcję "ctime" z C.
- %Tk
- Ostatni czas modyfikacji pliku, w formacie określonym przez
k, podobnie jak dla %A.
- %u
- Nazwa użytkownika pliku, lub numeryczny UID, jeśli
użytkownik nie ma nazwy.
- %U
- Numeryczny UID pliku.
- %y
- Typ pliku (podobnie jak w ls -l), "U" to typ nieznany
(ang. unknown, nie powinien wystąpić).
- %Y
- Typ pliku (jak %y), lecz podąża za dowiązaniami:
"L" to pętla (ang. loop), a "N" - oznacza
nieistniejący.
Znak "%" po którym występuje dowolny inny znak jest
ignorowany, lecz ten drugi znak jest wypisywany (nie należy na tym
polegać, gdyż mogą zostać wprowadzone nowe znaki
formatu). Symbol "%" na końcu argumentu formatu skutkuje
niezdefiniowanym zachowaniem, ponieważ brak jest następnego
znaku. W niektórych ustawieniach regionalnych opcja ta może
ukryć klucz do domu, w innych usunąć ostatnią
stronicę czytanej powieści. Ostrzegaliśmy!
Dyrektywy %m i %d obsługują flagi
#,
0 i
+,
lecz inne dyrektywy nie, nawet jeśli wyświetlają liczby.
Do dyrektyw liczbowych, które nie obsługują tych flag,
należą
G,
U,
b,
D,
k i
n. Flaga formatu "-" jest obsługiwana i zmienia
wyrównanie pól z prawego (domyślnego) na lewy.
Rozdział
NIETYPOWE NAZWY PLIKÓW zawiera informacje nt.
obsługi nietypowych nazw plików.
- -prune
- Prawda; jeśli plik jest katalogiem, nie zagłębia
się w niego. Jeśli podano -depth - fałsz, brak
działania. Ponieważ -delete implikuje -depth,
nie da się użyć -prunt i -delete
łącznie.
- -quit
- Natychmiast wychodzi. Nie są pozostawiane żadne
działające procesy potomne, lecz nie będzie
przetworzone więcej ścieżek podanych w wierszu
poleceń. Przykładowo, find /tmp/foo /tmp/bar -print
-quit wypisze jedynie /tmp/foo. Wiersze polecenia zbudowane za
pomocą -execdir ... () + zostaną wywołane
przed zakończeniem find. Kod zakończenia może
wynosi zero lub nie, w zależności od tego, czy
wystąpił dotychczas błąd.
NIETYPOWE NAZWY PLIKÓW¶
Wiele akcji
find skutkuje wypisywaniem danych, będących pod
kontrolą innych użytkowników. Dotyczy to nazw
plików, rozmiarów, czasów modyfikacji itp. Nazwy
plików są potencjalnym problemem, ponieważ mogą
zawierać dowolne znaki oprócz "\0" i "/".
Nietypowe znaki w nazwach plików mogą robić nieoczekiwane
i często nieprzewidywalne rzeczy z terminalem użytkownika (np.
zmieniać ustawienia klawiszy funkcyjnych niektórych terminali).
Nietypowe znaki są obsługiwane w różny
sposób, w zależności od akcji, zgodnie z poniższym
opisem.
- -print0, -fprint0
- Zawsze wypisuje dokładne nazwy plików, niezmienione, nawet
jeśli wynik trafia na terminal
- -ls, -fls
- Nietypowe znaki są zawsze cytowane. Białe znaki, odwrotny
ukośnik i znak podwójnego cudzysłowu jest wypisywany
za pomocą cytowania w stylu C (np \f lub \" ). Inne nietypowe
znaki są wypisywane za pomocą cytowania ósemkowego.
Inne znaki drukowalne (dla -ls i -fls są to znaki
pomiędzy ósemkowym 041 i 0176) są wypisywane bez
zmian.
- -printf, -fprintf
- Jeśli wynik nie trafia na terminal, nic nie jest zmieniane. W
przeciwnym razie, wynik zależy od używanej dyrektywy.
Dyrektywy %D, %F, %g, %G, %H, %Y i %y są rozwijane do
wartości, które nie są pod kontrolą
właścicieli plików, są więc wypisywane
bez zmian. Dyrektywy %a, %b, %c, %d, %i, %k, %m, %M, %n, %s, %t, %u i %U
mają wartości będące pod kontrolą
właścicieli plików, lecz nie mogą być
one użyte do wysłania dowolnych danych na terminal, dlatego
są wypisywane bez zmian. Dyrektywy %f, %h, %l, %p i %P są
cytowane. Cytowanie jest wykonywane w ten sam sposób, jak w GNU
ls. Nie jest to ten sam mechanizm, co używany przez
-ls i -fls. Jeśli można zdecydować o
formacie wyniku find lepiej jest zwykle skorzystać z
"\0" jako ogranicznika, zamiast używać znaku
nowego wiersza, ponieważ nazwy plików mogą
zawierać białe znaki i znaki nowego wiersza. Ustawienie
zmiennej środowiskowej "LC_CTYPE" jest używane do
określenia tego, które znaki mają być
cytowane.
- -print, -fprint
- Cytowanie jest obsługiwane w ten sam sposób co w
-printf i -fprintf. Jeśli używa się
find w skrypcie lub w sytuacji, gdzie dopasowywane pliki
mogą mieć dowolne nazwy, powinno się
rozważyć skorzystanie z -print0 zamiast z
-print.
Akcje
-ok i
-okdir wypisują bieżące nazwy
plików bez zmian. Może się to zmienić w kolejnych
wydaniach.
OPERATORY¶
Wymienione według malejącego priorytetu:
- ( wyraż )
- Wymusza pierwszeństwo. Ponieważ nawiasy są znakami
specjalnymi dla powłoki, trzeba je zwykle cytować. Wiele
przykładów z niniejszej strony podręcznika
używa do tego celu odwrotnych ukośników:
"\(...\)" zamiast "(...)".
- ! wyraż
- Prawda, jeśli wyraż jest fałszywe. Znak ten
zwykle wymaga również ochrony przed interpretacją
przez powłokę.
- -not wyraż
- Jak ! wyraż, lecz nie jest zgodne z POSIX.
- wyraż1 wyraż2
- Dwa wyrażenia z rzędu są traktowane, jakby
były połączone jawnym i ("and");
wyraż2 nie jest analizowany jeśli
wyraż1 jest fałszywe.
- wyraż1 -a wyraż2
- To samo, co wyraż1 wyraż2.
- wyraż1 -and wyraż2
- To samo, co wyraż1 wyraż2, lecz nie jest zgodne z
POSIX.
- wyraż1 -o wyraż2
- Lub ("or"); wyraż2 nie jest analizowane
jeśli wyraż1 jest prawdziwe.
- wyraż1 -or wyraż2
- To samo, co wyraż1 -o wyraż2, lecz nie
jest zgodne z POSIX.
- wyraż1 , wyraż2
- Lista; zarówno wyraż1 jak i wyraż2
są zawsze analizowane. Wartość wyraż1
jest pomijana; wartością listy jest wartość
wyraż2. Operator w formie przecinka może być
przydatny do wyszukiwania wielu różnych typów rzeczy,
lecz przechodząc przez hierarchię systemu plików
tylko raz. Do wypisania różnych dopasowań do wielu
różnych plików wyjściowych, można
użyć akcji -fprintf.
ZGODNOŚĆ ZE STANDARDAMI¶
W celu najściślejszej zgodności ze standardem POSIX,
należy ustawić zmienną środowiskową
POSIXLY_CORRECT. W standardzie POSIX (IEEE Std 1003.1, 2003 Edition)
określono następujące opcje:
- -H
- Opcja jest obsługiwana.
- -L
- Opcja jest obsługiwana.
- -name
- Opcja jest obsługiwana, lecz zgodność z POSIX
zależy od zgodności z POSIX systemowej funkcji bibliotecznej
fnmatch(3). Od wersji findutils-4.2.2 metaznaki powłoki (np.
"*", "?", "[]") dopasują
początkowe ".", ponieważ wymaga tego interpretacja
126 IEEE PASC. Jest to zmiana w stosunku do poprzednich wersji findutils.
- -type
- Obsługiwane. POSIX określa "b", "c",
"d", "l", "p", "f" i
"s". GNU find obsługuje również
"D", reprezentujące Door, w systemach, które to
obsługują.
- -ok
- Obsługiwane. Interpretacja odpowiedzi jest zgodna z wzorcami
"yes" i "no" wybranymi przez ustawienie zmiennej
środowiskowej "LC_MESSAGES". Gdy ustawiona jest zmienna
środowiskowa "POSIXLY_CORRECT", wzorce te są
wzięte z systemowych definicji odpowiedzi pozytywnej (yes) lub
negatywnej (no). Proszę zapoznać się z
systemową dokumentacją nl_langinfo(3), w
szczególności YESEXPR i NOEXPR. Gdy
"POSIXLY_CORRECT" nie jest ustawiona, wzorce są brane z
własnego katalogu komunikatów find.
- -newer
- Obsługiwane. Jeśli podany plik jest dowiązaniem
symbolicznym, jest zawsze rozwiązywany. Jest to zmiana w stosunku
do wcześniejszego zachowania, gdy odpowiedni czas był brany
z samego dowiązania; patrz poniższy rozdział
HISTORIA.
- -perm
- Obsługiwane. Jeśli zmienna środowiskowa
POSIXLY_CORRECT nie jest ustawiona, część
argumentów trybu (np. +a+x), która nie jest
prawidłowa w POSIX, jest obsługiwana w celu zachowania
kompatybilności wstecznej.
- Inne wskazania
- Wszystkie wskazania: -atime, -ctime, -depth,
-group, -links, -mtime, -nogroup,
-nouser, -print, -prune, -size, -user i
-xdev są obsługiwane
Standard POSIX określa nawiasy "(", ")",
negację "!" i operatory "and" oraz "or" (
-a,
-o).
Wszystkie inne opcje, wskazania, wyrażenia itd. są rozszerzeniami
wykraczającymi poza standard POSIX. Wiele z nich nie jest jednak
unikalnych dla GNU find.
Standard POSIX wymaga wykrywania przez
find pętli:
- Narzędzie find powinno wykrywać pętle
nieskończone, tj. gdy wchodzi do wcześniej odwiedzonego
katalogu, będącego przodkiem pliku, który
wystąpił jako ostatni. Gdy pętla nieskończona
jest wykrywana, find powinien wypisać informację
diagnostyczną na standardowe wyjście
błędów i powinien albo odzyskać swą
pozycję w hierarchii albo wyjść.
GNU
find jest zgodny z tymi wymaganiami. Liczba dowiązań
katalogów zawierających wpisy będące
dowiązaniami zwykłymi (twardymi) do katalogu nadrzędnego
będzie często niższa, niż powinna być.
Oznacza to, że GNU find czasami zoptymalizuje liczbę
sprawdzeń podkatalogów będących dowiązaniem
do katalogu nadrzędnego. Ponieważ
find nie wchodzi w
rzeczywistości do każdego podkatalogu, może unikać
wyświetlania komunikatu diagnostycznego. Choć to zachowanie
może być niekiedy mylące, jest mało prawdopodobne,
aby ktokolwiek na nim polegał. Jeśli optymalizacja
"liściowa" (ang. leaf optimisation) zostanie
wyłączona za pomocą
-noleaf, wpis katalogu
zostanie zawsze sprawdzony, a gdy to będzie konieczne, zostanie
wypisany komunikat diagnostyczny. Dowiązanie symboliczne nie
może być użyte do tworzenia podobnych cykli systemu
plików, lecz jeśli działa opcja
-L lub
-follow, komunikat diagnostyczny zostanie wypisany, gdy
find
natrafi na pętlę dowiązań symbolicznych. Podobnie
jak w przypadku pętli z dowiązaniami zwykłymi (twardymi),
optymalizacja liściowa często będzie oznaczać,
że
find wie, iż nie musi wywoływać
stat() lub
chdir() na dowiązaniu symbolicznym,
więc taka diagnostyka często nie jest konieczna.
Opcja
-d jest obsługiwana w celu kompatybilności z
różnymi systemami BSD, lecz powinno się w zamian
używać zgodną z POSIX opcję
-depth.
Zmienna środowiskowa POSIXLY_CORRECT nie wpływa na zachowanie
testów
-regex ani
-iregex, ponieważ opcje te nie
są określone w standardzie POSIX.
ZMIENNE ŚRODOWISKOWE¶
- LANG
- Dostarcza domyślną wartość do zmiennych
dotyczących umiędzynarodowienia, które nie są
ustawione lub są puste.
- LC_ALL
- Jeśli jest ustawiona na niepusty łańcuch,
przesłania wartość wszystkich innych zmiennych
dotyczących umiędzynarodowienia.
- LC_COLLATE
- Standard POSIX określa, że ta zmienna wpływa na
dopasowanie wzorców używanych przez opcję
-name. GNU find używa funkcji bibliotecznej
fnmatch(3), w związku z tym obsługa niniejszej
zmiennej zależy od biblioteki systemowej. Zmienna ta wpływa
również na interpretację odpowiedzi na -ok -
podczas gdy zmienna "LC_MESSAGES" wybiera rzeczywisty wzorzec
używany do interpretacji odpowiedzi na -ok, interpretacja
wyrażeń klamrowych we wzorcu będzie zależna od
"LC_COLLATE"
- LC_CTYPE
- Zmienna wpływa na traktowanie klas znaków używanych w
wyrażeniach regularnych, jak również w teście
-name, jeśli obsługuje to systemowa funkcja
biblioteczna fnmatch(3). Zmienna wpływa
również na interpretację klas znakowych w
wyrażeniach regularnych używanych do interpretacji
odpowiedzi na pytanie wydane przez -ok. Zmienna środowiskowa
"LC_CTYPE" wpływa również na to,
które znaki są uważane za niedrukowalne przy
wypisywaniu nazw plików; patrz rozdział NIETYPOWE NAZWY
PLIKÓW.
- LC_MESSAGES
- Określa język (lokale) komunikatów. Jeśli
ustawiona jest zmienna środowiskowa "POSIXLY_CORRECT", to
określa również interpretację na
odpowiedź na pytanie zadane przez akcję -ok.
- NLSPATH
- Określa lokalizację katalogów z
przetłumaczonymi komunikatami.
- PATH
- Wpływa na katalogi, które są przeszukiwane przez find
w celu wykonania plików wywołanych przez -exec,
-execdir, -ok i -okdir.
- POSIXLY_CORRECT
- Określa rozmiar bloku używany przez -ls i
-fls. Jeśli ustawiona jest zmienna POSIXLY_CORRECT,
bloki mają po 512 bajtów. W przeciwnym wypadku - 1024
bajtów.
- Ustawienie tej zmiennej domyślnie wyłącza
również ostrzeżenia (tzn. implikuje -nowarn),
ponieważ niezależnie od wyniku -ok, POSIX wymaga aby
wszystkie komunikaty wypisywane na standardowe wyjście
błędów były diagnostyczne i wynikał z
nich niezerowy kod zakończenia.
- Gdy POSIXLY_CORRECT nie jest ustawiona, -perm +zzz jest traktowane
jak -perm /zzz jeśli +zzz nie jest prawidłowym trybem
symbolicznym. Gdy POSIXLY_CORRECT jest ustawiona, takie konstrukcje
są traktowane jako błąd.
- Gdy POSIXLY_CORRECT jest ustawiona, odpowiedź na pytanie zadane
przez akcję -ok jest interpretowane zgodnie z katalogiem
systemowym wiadomości, a nie zgodnie z własnymi
tłumaczeniami komunikatów programu find.
- TZ
- Wpływa na strefę czasową używaną przez
część związanych z czasem dyrektyw formatu
opcji -printf i -fprintf.
PRZYKŁADY¶
find /tmp -name core -type f -print | xargs /bin/rm -f
Znajduje pliki o nazwie
core w lub poniżej katalogu
/tmp i
usuwa je. Proszę zauważyć, że przykład nie
będzie działał poprawnie, jeśli w
którejś z nazw są znaki nowego wiersza, pojedyncze lub
podwójne cudzysłowy lub spacje.
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
Znajduje pliki o nazwie
core w lub poniżej katalogu
/tmp i
usuwa je, przetwarzając nazwy plików w ten sposób,
że nazwy zawierające pojedyncze lub podwójne
cudzysłowy, spacji lub znaki nowego wiersza są
obsługiwane poprawnie. Test
-name jest wykonywany przez
-type, aby zapobiec wywoływaniu
stat(2) na każdym
pliku.
find . -type f -exec file '{}' \;
Uruchamia "file" na każdym pliku w lub poniżej katalogu
bieżącego. Proszę zwrócić uwagę,
że nawiasy klamrowe są ujęte w pojedyncze
cudzysłowy, aby ochronić je przed interpretację przez
interpunkcję skryptów powłoki. Średnik jest
również chroniony, przez odwrotny ukośnik, choć
pojedyncze cudzysłowy byłyby równie dobre.
find / \
\( -perm -4000 -fprintf /root/suid.txt %#m %u %p\n \) , \
\( -size +100M -fprintf /root/big.txt %-10s %p\n \)
Przeszukuje system plików jeden raz, wypisując pliki i katalogi z
setuid do pliku
/root/suid.txt, a duże pliki do
/root/big.txt.
find $HOME -mtime 0
Wyszukuje pliki w katalogu domowym użytkownika, które
zostały zmodyfikowane w ciągu ostatnich 24 godzin. To polecenie
działa w ten sposób, ponieważ czas od ostatniej
modyfikacji pliku jest podzielony przez 24 godziny, a reszta jest odrzucana.
Oznacza to, że aby pasować do
-mtime 0, plik
musiał być zmodyfikowany mniej niż 24 godziny temu.
find /sbin /usr/sbin -executable \! -readable -print
Wyszukuje pliki wykonywalne, lecz nieodczytywalne.
find . -perm 664
Wyszukuje pliki posiadające prawa odczytu i zapisu dla
właściciela i grupy, które dla innych są
odczytywalne, lecz nie są zapisywalne. Pliki, które
spełniają te kryteria lecz mają ustawione inne bity praw
(np. wykonywalności) nie są dopasowane.
find . -perm -664
Wyszukuje pliki posiadające prawa odczytu i zapisu dla
właściciela i grupy, które dla innych są
odczytywalne, bez względu na obecność jakichś
dodatkowych bitów praw (np. bitu wykonywalności). Dopasowany
będzie też np. plik z trybem 0777.
find . -perm /222
Wyszukuje pliki, które są przez kogoś zapisywalne (dla ich
właściciela, grupy lub innych).
find . -perm /220
find . -perm /u+w,g+w
find . -perm /u=w,g=w
Wszystkie trzy polecenia wykonują to samo, lecz pierwsze używa
reprezentacji ósemkowej praw lików, a pozostałe dwa -
postaci symbolicznej. Wszystkie polecenia wyszukują pliki, które
są zapisywalne albo przez ich właściciela, albo
grupę. Pliki nie muszą być zapisywalne zarówno
przez właściciela jak i grupę, aby zostać
dopasowane; wystarczy spełnić jeden warunek.
find . -perm -220
find . -perm -g+w,u+w
Oba polecenia robią to samo: wyszukują pliki będące
zapisywalne zarówno dla ich właściciela jak i grupy.
find . -perm -444 -perm /222 ! -perm /111
find . -perm -a+r -perm /a+w ! -perm /a+x
Oba polecenia wyszukują pliki odczytywalne dla wszystkich (
-perm
-444 lub
-perm -a+r), mające ustawiony co najmniej jeden bit
zapisu (
-perm /222 lub
-perm /a+w), lecz nie
będące wykonywalne dla kogokolwiek (odpowiednio
! -perm
/111 i
! -perm /a+x).
cd /source-dir
find . -name .snapshot -prune -o \( \! -name *~ -print0 \)|
cpio -pmd0 /dest-dir
Polecenie to kopiuje zawartość
/source-dir do
/dest-dir, lecz pomija pliki lub katalogi o nazwach
.snapshot (i
wszystko wewnątrz ich). Pomija również pliki lub katalogi
o nazwach kończących się na
~, lecz nie ich
zawartość. Konstrukcja
-prune -o \( ... -print0 \) jest
dość częsta. Pomysł jest taki, że
wyrażenie przed
-prune dopasowuje rzeczy, które
mają być wycięte. Jednak sama akcja
-prune zwraca
prawdę, więc kolejna
-o upewnia się, że
prawa strona jest obliczana tylko dla niewyciętych katalogów
(zawartość wycinanych katalogów nie jest nawet
sprawdzana, więc ich zawartość jest nieistotna).
Wyrażenie po prawej stronie
-o, znajduje się w nawiasach
jedynie dla przejrzystości. Podkreśla, że akcja
-print0 ma miejsce jedynie do rzeczy, do których nie zastosowano
-prune. Ponieważ domyślna zależność
"and" (i) jest ściślejsza niż
-o, tak
jest domyślnie, lecz nawiasy pomagają pokazać o co
chodzi.
find repo/ -exec test -d {}/.svn -o -d {}/.git -o -d {}/CVS ; \
-print -prune
Podając następujący katalog projektu i powiązany
katalog administracyjny SCM, wykonuje wydajne wyszukiwanie korzeni
projektów:
repo/project1/CVS
repo/gnu/project2/.svn
repo/gnu/project3/.svn
repo/gnu/project3/src/.svn
repo/project4/.git
W tym przykładzie,
-prune zapobiega niepotrzebnemu
zagłębianiu się w już odkryte katalogi (np. nie
szuka się w project3/src, ponieważ znaleziono już
project3/.svn), lecz znajduje katalogi sąsiednie (project2 i project3).
KOD ZAKOŃCZENIA¶
find wychodzi ze statusem 0, gdy pomyślnie przetworzono wszystkie
pliki i większym niż 0, gdy wystąpił
błąd. Jest to bardzo ogólny opis, lecz gdy
zwracaną wartością nie jest zero, nie powinno się
po prostu polegać na poprawności wyników
find.
ZOBACZ TAKŻE¶
locate(1),
locatedb(5),
updatedb(1),
xargs(1),
chmod(1),
fnmatch(3),
regex(7),
stat(2),
lstat(2),
ls(1),
printf(3),
strftime(3),
ctime(3),
Finding Files (on-line w Info lub w formie
drukowanej).
HISTORIA¶
Od findutils-4.2.2, metaznaki powłoki (np. "*", "?"
lub "[]") używane we wzorcach nazw plików
dopasują początkowe ".", ponieważ wymaga tego
interpretacja 126 IEEE POSIX.
Składnia
-perm +TRYB została uznana za
przestarzałą w findutils-4.2.21, na korzyść
-perm / TRYB. Od findutils-4.3.3,
-perm /000
dopasowuje wszystkie pliki, zamiast żadnego.
W findutils-4.3.3 zaimplementowano nanosekundową
rozdzielczość znaczników czasu.
Od findutils-4.3.11, akcja
-delete ustawia kod zakończenia
find na wartość niezerową, jeśli się
nie powiedzie.
find nie wyjdzie jednak od razu. Wcześniej, kod
zakończenia
find nie zmieniał się pod
wpływem niepowodzenia
-delete.
Funkcja |
Dodana w |
Pojawia się też w |
-newerXY |
4.3.3 |
BSD |
-D |
4.3.1 |
|
-O |
4.3.1 |
|
-readable |
4.3.0 |
|
-writable |
4.3.0 |
|
-executable |
4.3.0 |
|
-regextype |
4.2.24 |
|
-exec ... + |
4.2.12 |
POSIX |
-execdir |
4.2.12 |
BSD |
-okdir |
4.2.12 |
|
-samefile |
4.2.11 |
|
-H |
4.2.5 |
POSIX |
-L |
4.2.5 |
POSIX |
-P |
4.2.5 |
BSD |
-delete |
4.2.3 |
|
-quit |
4.2.3 |
|
-d |
4.2.3 |
BSD |
-wholename |
4.2.0 |
|
-iwholename |
4.2.0 |
|
-ignore_readdir_race |
4.2.0 |
|
-fls |
4.0 |
|
-ilname |
3.8 |
|
-iname |
3.8 |
|
-ipath |
3.8 |
|
-iregex |
3.8 |
|
TO NIE SĄ BŁĘDY¶
$ find . -name *.c -print
find: ścieżki muszą poprzedzać wyrażenie
Składnia: %s [-H] [-L] [-P] [-Opoziom] [-D help|tree|
search|stat|rates|opt|exec] [ścieżka...] [wyrażenie]
Powodem takiego zachowania jest interpretacja
*.c przez
powłokę, co skutkuje następującym poleceniem
otrzymanym przez program
find.
find . -name bigram.c code.c frcode.c locate.c -print
To polecenie oczywiście nie będzie działać.
Poprawną metodą jset ujęcie wzorca w cudzysłowy
lub zacytowanie maski:
$ find . -name \*.c -print
BŁĘDY¶
Występują pewne zagrożenia związane z
bezpieczeństwem, będące wynikiem tego, co standard POSIX
przewiduje dla
find - dlatego nie mogą być naprawione. Na
przykład akcja
-exec jest niebezpieczna i powinno się
używać w zamian
-execdir. Proszę zapoznać
się z
Finding Files, aby dowiedzieć się
więcej.
Zmienna środowiskowa
LC_COLLATE nie ma wpływu na
akcję
-ok.
Najlepszą drogą do zgłoszenia błędu jest
użycie formularza na stronie
http://savannah.gnu.org/bugs/?group=findutils. Możliwe jest
wówczas śledzenie postępu naprawiania
błędu. Pozostałe komentarze dotyczące
find(1) i ogólnie, nt. pakietu findutils, można
wysyłać na listę dyskusyjną
bug-findutils.
Aby się na nią zapisać, proszę
wysłać list elektroniczny na adres
bug-findutils-request@gnu.org.
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika man
są: Przemek Borys (PTM) <pborys@dione.ids.pl> i Michał
Kułach <michal.kulach@gmail.com>.
Polskie tłumaczenie jest częścią projektu
manpages-pl; uwagi, pomoc, zgłaszanie błędów na
stronie
http://sourceforge.net/projects/manpages-pl/. Jest zgodne z
wersją
4.4.2 oryginału.