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/*'