Odpowiedzi:
Użyj -o
flagi 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 -f
do zastosowania do wszystkich argumentów-o
- logiczny operator OR-iname
- jak -name
, ale dopasowanie nie uwzględnia wielkości litertype -f
Nie rozciąga się i stosować do obu wyrażeń bez nawiasów, więc find ./ -type f -iname \*.jpg -o -type f -iname \*.png
działa także ... chociaż to dwa znaki już :-)
a * b + c
różni się oda * (b + c)
Można łączyć z kryteriów -o
jak sugeruje Shadur . Zauważ, że -o
ma 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 -regex
połączeniu z -E
rozszerzonymi wyrażeniami regularnymi.
find -E . -regex '.*\.(jpg|png)'
-iname
zamiast -name
- wtedy również przechwycisz image.JPG
iimage.PnG
Jest to bardziej poprawne:
find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
-iregex
mecze jpg
są JPG Jpg jpG
takie 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 -name
wzór pasujący do wielu wzorów w SO