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:

  1. c : bajty
  2. w : 2 bajty
  3. b : 512 bajtów (domyślnie)
  4. k : 1 KB
  5. M : 1 MB
  6. 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/*'


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow