Odpowiedzi:
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 litertype -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ż :-)
a * b + cróżni się oda * (b + c)
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)'
-inamezamiast -name- wtedy również przechwycisz image.JPGiimage.PnG
Jest to bardziej poprawne:
find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
-iregexmecze jpgsą JPG Jpg jpGtakie same . Myślę, że $to nie jest potrzebne.
find -E . -iregex '.*\.(jpg|png|gif)'jak pokazano w odpowiedzi @ sorin.
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.
-type f \( -iname \*.png -o -iname \*.jpg\)nie działa na OSX?
find -namewzór pasujący do wielu wzorów w SO