Jak używać polecenia find do wyszukiwania wielu rozszerzeń


Odpowiedzi:


152

Użyj -oflagi między różnymi parametrami.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) działa jak marzenie.

UWAGA Pomiędzy wspornikiem a jego zawartością musi być odstęp, aby nie działał.

Wyjaśnienie:

  • type -f - szukaj tylko plików (nie katalogów)
  • \(- potrzebne type -fdo zastosowania do wszystkich argumentów
  • -o - logiczny operator OR
  • -iname- jak -name, ale dopasowanie nie uwzględnia wielkości liter

Czy potrzebujesz nawiasów? Polecenie działa dla mnie bez nich. Czy są potrzebne do niektórych pocisków?
MikeD

2
@miked Polecenie „zadziała” bez nich, tak, ale trafiałbyś do katalogów, które kończą się na .png, a także do plików z rozszerzeniem .jpg, co nie jest dokładnie takie, jak zamierzano.
Shadur

1
Dzięki za wytłumaczenie! type -fNie rozciąga się i stosować do obu wyrażeń bez nawiasów, więc find ./ -type f -iname \*.jpg -o -type f -iname \*.pngdziała także ... chociaż to dwa znaki już :-)
miked

2
Jest to kwestia pierwszeństwa operatora. Tak jak a * b + cróżni się oda * (b + c)
Shadur

2
@jdhao Dobry połów, poprawiony.
Shadur

86

Można łączyć z kryteriów -ojak sugeruje Shadur . Zauważ, że -oma niższy priorytet niż zestawianie, więc możesz potrzebować nawiasów.

find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \)  # all .jpg or .png images modified in the past week

W systemie Linux można -regexłączyć rozszerzenia w bardziej uproszczony sposób. Domyślna składnia wyrażeń regularnych to Emacs ( podstawowe wyrażenia regularne plus kilka rozszerzeń, takich jak \|na przemian); istnieje opcja przejścia na rozszerzone wyrażenia regularne .

find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'

W FreeBSD, NetBSD i OSX można używać w -regexpołączeniu z -Erozszerzonymi wyrażeniami regularnymi.

find -E . -regex '.*\.(jpg|png)'

Zawsze lepiej jest używać -inamezamiast -name- wtedy również przechwycisz image.JPGiimage.PnG
ccpizza

40

Jest to bardziej poprawne:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'

10
Dlaczego mówicie, że to „więcej” poprawne?
Kevin,

2
@Kevin Chyba dlatego, że -iregexmecze jpgJPG Jpg jpGtakie same . Myślę, że $to nie jest potrzebne.
ott--

Działa to dobrze na MinGW .
Peter Mortensen

2
Po pierwsze, pominąłeś folder wyszukiwania jako pierwszy argument, który zgłosi błąd. Po drugie, ucieczka z OSX w nawiasie nie będzie działać, a zamiast tego należy użyć: find -E . -iregex '.*\.(jpg|png|gif)'jak pokazano w odpowiedzi @ sorin.
ccpizza

8

Aby to wyjaśnić, jedyną opcją, która działa w systemach Linux, Unix i macOS jest:

find -E . -regex '.*\.(jpg|png)'

Jest tak, ponieważ wersja OS X jest nieco inna, ale ważne jest, aby pisać rzeczy, które dobrze pasują na większości platform.


2
-E Flaga nie jest ważna dla find na Ubuntu 14.04
gogaman

Flaga -E również nie jest poprawna na MinGW (przynajmniej wersja / konfiguracja, na której próbowałem (domyślna konfiguracja dla konkretnej wersji)).
Peter Mortensen,

Która część -type f \( -iname \*.png -o -iname \*.jpg\)nie działa na OSX?
Shadur

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.