Как использовать, находят, что команда ищет несколько расширений

История этих чисел раздела возвращается к Руководству исходного Unix-программиста Thompson и Ritchie в 1971.

Исходные разделы были

  1. Команды
  2. Системные вызовы
  3. Подпрограммы
  4. Специальные файлы
  5. Форматы файлов
  6. Сохраняемые пользователями программы
  7. Разное

136
20.06.2011, 21:51
5 ответов

Используйте -o флаг между различными параметрами.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) работы как очарование.

ПРИМЕЧАНИЕ. Должно быть пространство между скобкой и ее содержанием, или это не будет работать.

Объяснение:

  • -type f - только поиск файлов (не каталоги)
  • \( & \) - необходимы для -type f относиться ко всем аргументам
  • -o - логическая операция ИЛИ
  • -iname - как -name, но соответствие нечувствительно к регистру
166
27.01.2020, 19:29
  • 1
    Сделайте Вам нужны круглые скобки. Команда работает на меня без них. Они необходимы для некоторых оболочек? –  MikeD 19.03.2017, 04:25
  • 2
    @miked команда будет "работать" без них, да, но Вы волновали бы получение хитов на каталогах, которые заканчиваются в .png, а также файлах, которые заканчиваются .jpg, который не является точно, что было предназначено. группа –  Shadur 19.03.2017, 10:25
  • 3
    Спасибо за разъяснение! type -f не расширяется и относится к обоим выражениям без круглых скобок, Так, find ./ -type f -iname \*.jpg -o -type f -iname \*.png также работы..., хотя это - два символа более длинный :-) –  MikeD 19.03.2017, 13:58
  • 4
    Это - вопрос приоритета оператора. Точно так же, как a * b + c отличается от a * (b + c) –  Shadur 19.03.2017, 14:13

Можно объединить критерии с -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 (основной regexps плюс несколько расширений такой как \| для чередования); существует опция переключиться на расширенный regexps.

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

На FreeBSD, NetBSD и OSX, можно использовать -regex объединенный с -E для расширенного regexps.

find -E . -regex '.*\.(jpg|png)'
89
27.01.2020, 19:29
  • 1
    Всегда лучше использовать -iname вместо -name — затем Вы также получите image.JPG и image.PnG –  ccpizza 11.11.2017, 12:48

Это более корректно:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
41
27.01.2020, 19:29
  • 1
    Почему Вы говорите, что это "более" корректно? –  Kevin 17.11.2012, 05:51
  • 2
    @Kevin я предполагаю потому что -iregex соответствия jpg а также JPG Jpg jpG и такой. Я думаю $ не необходим. номер –  ott-- 19.05.2015, 13:41
  • 3
    Это хорошо работает на MinGW. –  Peter Mortensen 18.09.2015, 14:30
  • 4
    Сначала, Вы опустили поисковую папку как первый аргумент, который бросит ошибку. Во-вторых, на OSX выход из круглой скобки не будет работать, и это должно использоваться вместо этого: find -E . -iregex '.*\.(jpg|png|gif)' как показано в ответе @sorin. –  ccpizza 11.11.2017, 13:36

Для прояснения единственная опция, которая работает над Linux, Unix и macOS ароматом:

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

Поэтому версия OS X немного отличается, но это важно для записи вещей, которые подходят на большинстве платформ.

8
27.01.2020, 19:29
  • 1
    E не допустим для находки на Ubuntu 14.04 –  gogaman 25.07.2014, 20:33
  • 2
    Флаг-E не допустим на MinGW ни один (по крайней мере, версия/конфигурация, я примерил его (конфигурация по умолчанию для конкретной версии)). –  Peter Mortensen 18.09.2015, 14:29
  • 3
    Какая часть -type f \( -iname \*.png -o -iname \*.jpg\) не работает над OSX? –  Shadur 16.04.2018, 10:43
/\.(jpe?g|png|gif|bmp)$/i;

Используйте его.

-4
27.01.2020, 19:29

Теги

Похожие вопросы