Відповіді:
Використовуйте -oпрапор між різними параметрами.
find ./ -type f \( -iname \*.jpg -o -iname \*.png \) працює як шарм.
Примітка Там повинно бути простір між кронштейном і його зміст або він не буде працювати.
Пояснення:
type -f - лише пошук файлів (не каталогів)\(- необхідний для type -fзастосування для всіх аргументів-o - логічний оператор АБО-iname- як -name, але відповідність нечутлива до регіструtype -fЧи не поширюється і поширюється на обох виразів без дужок, так, find ./ -type f -iname \*.jpg -o -type f -iname \*.pngтеж працює ... хоча це два символи більше :-)
a * b + cі відрізняється відa * (b + c)
Ви можете комбінувати критерії з , -oяк було запропоновано Shadur . Зауважте, що -oвона має нижчий пріоритет, ніж порівняння, тому вам можуть знадобитися круглі дужки.
find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \) # all .jpg or .png images modified in the past week
У Linux ви можете використовувати -regexдля комбінування розширень більш стислим способом. За замовчуванням синтаксис regexp - Emacs ( базові регулярні вирази плюс кілька розширень, наприклад, \|для чергування); є можливість переключитися на розширені регулярні вирази .
find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'
На FreeBSD, NetBSD та OSX можна використовувати -regexкомбіновані з -Eдля розширених регулярних виразів.
find -E . -regex '.*\.(jpg|png)'
-inameзамість -name- тоді ви також захопите image.JPGіimage.PnG
Це правильніше:
find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
-iregexсірники jpgтак само JPG Jpg jpGі такі. Я думаю, що $це не потрібно.
find -E . -iregex '.*\.(jpg|png|gif)'як показано у відповіді @ sorin.
Щоб зрозуміти, єдиний варіант, який працює на Linux, Unix та macOS, є:
find -E . -regex '.*\.(jpg|png)'
Це тому, що версія OS X трохи інша, але це важливо, щоб написати речі, які добре підходять на більшості платформ.
-type f \( -iname \*.png -o -iname \*.jpg\)не працює на OSX?
find -nameвізерунок, який відповідає декільком шаблонам на SO