Szukaj…
Wprowadzenie
find to polecenie, aby rekurencyjnie przeszukiwać katalog w poszukiwaniu plików (lub katalogów), które spełniają kryteria, a następnie wykonać pewne czynności na wybranych plikach.
znajdź działanie ścieżka_wyszukiwania kryteria_wybrania
Składnia
- znajdź [-H] [-L] [-P] [-D debugopts] [-Olevel] [ścieżka ...] [wyrażenie]
Wyszukiwanie pliku według nazwy lub rozszerzenia
Aby znaleźć pliki / katalogi o określonej nazwie w stosunku do pwd
:
$ find . -name "myFile.txt"
./myFile.txt
Aby znaleźć pliki / katalogi z określonym rozszerzeniem, użyj symbolu wieloznacznego:
$ find . -name "*.txt"
./myFile.txt
./myFile2.txt
Aby znaleźć pliki / katalogi pasujące do jednego z wielu rozszerzeń, użyj flagi or
:
$ find . -name "*.txt" -o -name "*.sh"
Aby znaleźć pliki / katalogi, których nazwa zaczyna się na abc i kończy na jednym znaku alfabetu po jednej cyfrze:
$ find . -name "abc[a-z][0-9]"
Aby znaleźć wszystkie pliki / katalogi znajdujące się w określonym katalogu
$ find /opt
Aby wyszukiwać tylko pliki (nie katalogi), użyj -type f
:
find /opt -type f
Aby wyszukać tylko katalogi (nie zwykłe pliki), użyj -type d
:
find /opt -type d
Znajdowanie plików według typu
Aby znaleźć pliki, użyj flagi -type f
$ find . -type f
Aby znaleźć katalogi, użyj flagi -type d
$ find . -type d
Aby znaleźć urządzenia blokowe, użyj flagi -type b
$ find /dev -type b
Aby znaleźć dowiązania symboliczne, użyj flagi -type l
$ find . -type l
Wykonywanie poleceń na znalezionym pliku
Czasami będziemy musieli uruchamiać polecenia dla wielu plików. Można to zrobić za pomocą xargs
.
find . -type d -print | xargs -r chmod 770
Powyższe polecenie rekurencyjnie znajdzie wszystkie katalogi ( -type d
) względem .
(który jest twoim bieżącym katalogiem roboczym) i uruchom na nich chmod 770
. Opcja -r
określa, aby xargs
nie uruchamiał chmod
jeśli find
nie znalazł żadnych plików.
Jeśli w nazwach plików lub katalogach jest spacja, to polecenie może się zadławić; rozwiązaniem jest użycie następujących
find . -type d -print0 | xargs -r -0 chmod 770
W powyższym przykładzie flagi -print0
i -0
określają, że nazwy plików będą rozdzielane bajtem null
, i umożliwiają stosowanie znaków specjalnych, takich jak spacje, w nazwach plików. Jest to rozszerzenie GNU i może nie działać w innych wersjach find
i xargs
.
Preferowanym sposobem na to jest pominięcie polecenia xargs
i umożliwienie find
wywołania samego podprocesu:
find . -type d -exec chmod 770 {} \;
Tutaj {}
jest symbolem zastępczym wskazującym, że w tym momencie chcesz użyć nazwy pliku. find
wykona chmod
dla każdego pliku osobno.
Alternatywnie możesz przekazać wszystkie nazwy plików do pojedynczego wywołania chmod
, używając
find . -type d -exec chmod 770 {} +
Jest to również zachowanie powyższych fragmentów xargs
. (Aby wywołać każdy plik osobno, możesz użyć xargs -n1
).
Trzecią opcją jest umożliwienie bashowi zapętlenia listy nazw plików w celu find
wyników:
find . -type d | while read -r d; do chmod 770 "$d"; done
Jest to syntaktycznie najbardziej nieporęczne, ale wygodne, gdy chcesz uruchomić wiele poleceń na każdym znalezionym pliku. Jest to jednak niebezpieczne w przypadku nazw plików o nieparzystych nazwach.
find . -type f | while read -r d; do mv "$d" "${d// /_}"; done
który zastąpi wszystkie spacje w nazwach plików podkreśleniami. (Ten przykład nie działa również, jeśli w wiodących nazwach katalogów są spacje).
Problem z powyższym polega na tym while read -r
że while read -r
oczekuje jednego wpisu w wierszu, ale nazwy plików mogą zawierać znaki nowej linii (a także read -r
spowoduje utratę spacji końcowych). Możesz to naprawić, zmieniając rzeczy:
find . -type d -exec bash -c 'for f; do mv "$f" "${f// /_}"; done' _ {} +
W ten sposób -exec
otrzymuje nazwy plików w postaci całkowicie poprawnej i przenośnej; bash -c
odbiera je jako liczbę argumentów, które można znaleźć w $@
, poprawnie cytowane itp. (Skrypt będzie oczywiście musiał poprawnie obsługiwać te nazwy; każda zmienna zawierająca nazwę pliku musi być podwojona cytaty.)
Tajemnicze _
jest konieczne, ponieważ pierwszy argument bash -c 'script'
jest używany do wypełnienia $0
.
Znajdowanie pliku według czasu dostępu / modyfikacji
W systemie plików ext
każdy plik ma zapisany czas dostępu, modyfikacji i (Status) zmiany czasu - aby wyświetlić te informacje, możesz użyć stat myFile.txt
; Używając flag w find , możemy wyszukiwać pliki, które zostały zmodyfikowane w określonym przedziale czasu.
Aby znaleźć pliki, które zostały zmodyfikowane w ciągu ostatnich 2 godzin:
$ find . -mmin -120
Aby znaleźć pliki, które nie zostały zmodyfikowane w ciągu ostatnich 2 godzin:
$ find . -mmin +120
Powyższy przykład szukają tylko od czasu zmodyfikowanej - aby wyszukiwać za czasów OSTĘP lub C powieszono stale korzystają lub a
c
odpowiednio.
$ find . -amin -120
$ find . -cmin +120
Ogólny format:
-mmin n
: Plik został zmodyfikowany n minut temu
-mmin -n
: plik został zmodyfikowany mniej niż n minut temu
-mmin +n
: plik został zmodyfikowany ponad n minut temu
Znajdź pliki, które zostały zmodyfikowane w ciągu ostatnich 2 dni:
find . -mtime -2
Znajdź pliki, które nie zostały zmodyfikowane w ciągu ostatnich 2 dni
find . -mtime +2
Użyj -atime
i -ctime
dla czasu dostępu i czasu zmiany statusu.
Ogólny format:
-mtime n
: Plik został zmodyfikowany nx24 godziny temu
-mtime -n
: Plik został zmodyfikowany mniej niż nx24 godziny temu
-mtime +n
: plik został zmodyfikowany ponad nx24 godziny temu
Znajdź pliki zmodyfikowane w różnych datach , od 2007-06-07 do 2007-06-08:
find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08
Znajdź pliki dostępne w różnych znacznikach czasu (używając plików jako znaczników czasu) od 1 godziny temu do 10 minut temu:
touch -t $(date -d '1 HOUR AGO' +%Y%m%d%H%M.%S) start_date
touch -t $(date -d '10 MINUTE AGO' +%Y%m%d%H%M.%S) end_date
timeout 10 find "$LOCAL_FOLDER" -newerat "start_date" ! -newerat "end_date" -print
Ogólny format:
-newerXY reference
: porównuje znacznik czasu bieżącego pliku z referencją. XY
może mieć jedną z następujących wartości: at
(czas dostępu), mt
(czas modyfikacji), ct
(czas zmiany) i więcej. reference
to nazwa pliku, w którym chce się porównać określony znacznik czasu (dostęp, modyfikacja, zmiana) lub ciąg opisujący czas bezwzględny.
Znajdowanie plików według określonego rozszerzenia
Aby znaleźć wszystkie pliki określonego rozszerzenia w bieżącej ścieżce, możesz użyć następującej składni find
. Działa poprzez wykorzystanie bash's
wbudowany w glob
konstruktem dopasować wszystkie nazwy mające .extension
.
find /directory/to/search -maxdepth 1 -type f -name "*.extension"
Aby znaleźć wszystkie pliki typu .txt
z bieżącego katalogu, wykonaj:
find . -maxdepth 1 -type f -name "*.txt"
Znajdowanie plików według rozmiaru
Znajdź pliki większe niż 15 MB:
find -type f -size +15M
Znajdź pliki mniejsze niż 12 KB:
find -type f -size -12k
Znajdź pliki dokładnie o rozmiarze 12 KB:
find -type f -size 12k
Lub
find -type f -size 12288c
Lub
find -type f -size 24b
Lub
find -type f -size 24
Ogólny format:
find [options] -size n[cwbkMG]
Znajdź pliki o rozmiarze n-bloku, gdzie + n oznacza więcej niż n-bloku, -n oznacza mniej niż n-bloku, a n (bez żadnego znaku) oznacza dokładnie n-bloku
Rozmiar bloku:
-
c
: bajty -
w
: 2 bajty -
b
: 512 bajtów (domyślnie) -
k
: 1 KB -
M
: 1 MB -
G
: 1 GB
Filtruj ścieżkę
Parametr -path
pozwala określić wzorzec pasujący do ścieżki wyniku. Wzór może pasować również do samej nazwy.
Aby znaleźć tylko pliki zawierające log
dowolnym miejscu na ścieżce (folder lub nazwa):
find . -type f -path '*log*'
Aby znaleźć tylko pliki w folderze o nazwie log
(na dowolnym poziomie):
find . -type f -path '*/log/*'
Aby znaleźć tylko pliki w folderze o nazwie log
lub data
:
find . -type f -path '*/log/*' -o -path '*/data/*'
Aby znaleźć wszystkie pliki oprócz tych zawartych w folderze o nazwie bin
:
find . -type f -not -path '*/bin/*'
Aby znaleźć wszystkie pliki, wszystkie pliki oprócz tych zawartych w folderze o nazwie bin
lub pliki dziennika:
find . -type f -not -path '*log' -not -path '*/bin/*'