ImageMagick против Bash/Zsh: использование *.(format1|format2) против «*.{format1,format2}»

Чтобы проверить правильность расширений имен файлов моих изображений, то есть действительно ли мои файлы JPEG являются JPEG, PNG — действительно PNG, а WebP — действительно WebP, я могу использовать следующую команду ImageMagick:

magick identify -format "%f: %m\n" *.(jp*|png|webp)

Или я могу использовать "*.{jp*,png,webp}" вместо этого:

magick identify -format "%f: %m\n" "*.{jp*,png,webp}"

Обратите внимание на кавычки. В противном случае, если ваша целевая папка не будет содержать хотя бы один файл каждого формата, возникнет ошибка.

magick identify -format "%f: %m\n" *.{jp*,png,webp}
zsh: no matches found: *.webp

Сам ImageMagick поддерживает синтаксисы как *.(foo|bar|barz), так и "*.{foo,bar,baz}", но Zsh в моей macOS и, я полагаю, Bash в Linux и BSD поддерживает только первый из них, с круглыми скобками ().

# works
file *.(jp*|png|webp)
# doesn't work at all. the {} syntax is not
# supported by Zsh and probably Bash
file *.{jp*,png,webp}

Отсюда мой вопрос. Какой синтаксис нам следует предпочесть в скриптах ImageMagick (например, при использовании magick identify): с (), который поддерживается как ImageMagick, так и Zsh/Bash, или с {}, который поддерживается только ImageMagick?


Краткое изложение моих и Фреда тестов (fmw42)

Баш Зш magick identify *.(jpg|png) – ✓ magick identify *.{jpg,png} ✓ ✓† magick identify "*.{jpg,png}" ✓ ✓
Баш Зш file *.(jpg|png) – ✓ file *.{jpg,png} ✓‡ ✓† file "*.{jpg,png}" – –

✓ - Работает. У вас могут быть а) и JPG, и PNG, или б) только PNG, или в) только JPG, или г) ничего
✓† - Работает, но у вас должен быть хотя бы один JPG и один PNG
✓‡ - Работает, но если у вас нет хотя бы одного JPG и одного PNG, будет предупреждение
– – Не работает

GNU bash, версия 3.2.57(1)-релиз (arm64-apple-darwin23)
зш 5.9 (x86_64-apple-darwin23.0)

*.{jp*,png,webp} расширяется как с помощью bash, так и с помощью zsh до *.jp* *.png *.webp перед расширением имени файла. Если один из этих шаблонов не соответствует ни одному файлу, поведение zsh (может быть, и bash тоже?) по умолчанию вызывает ошибку. Обе оболочки имеют параметры для точного управления поведением.
Shawn 06.05.2024 18:44

Что означают v, - и ? имеется в виду в твоей таблице?

fmw42 07.05.2024 00:13

@fmw42 V в нижнем регистре означает галочку (то есть синтаксис поддерживается); дефис означает тире (то есть синтаксис не поддерживается). Знаки вопроса — это то, что я не могу проверить сам (и в чем я прошу вас мне помочь).

user22996855 07.05.2024 00:23

@ jsx97 magick identify *.{jpg,png} у меня работает в bash и создает обычный список файлов JPG и PNG. У меня нет файлов WEBP в этом каталоге.

fmw42 08.05.2024 17:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На моем M1 Mac OSX Ventura в bash я получаю

magick identify -format "%f: %m\n" *.(jp*|png|webp)

bash: syntax error near unexpected token `('

но

magick identify -format "%f: %m\n" "*.{jp*,png,webp}"

barn.jpg: JPEG
image.png: PNG
lena.jpg: JPEG
lena.png: PNG
mandril3.jpg: JPEG
monet2.jpg: JPEG
redhat.jpg: JPEG
zelda1.jpg: JPEG

Так что мне кажется, что последнее в bash лучше.

В zsh я получаю

magick identify -format "%f: %m\n" *.(jp*|png|webp)
barn.jpg: JPEG
image.png: PNG
lena.jpg: JPEG
lena.png: PNG
mandril3.jpg: JPEG
monet2.jpg: JPEG
redhat.jpg: JPEG
zelda1.jpg: JPEG

и

magick identify -format "%f: %m\n" "*.{jp*,png,webp}"
barn.jpg: JPEG
image.png: PNG
lena.jpg: JPEG
lena.png: PNG
mandril3.jpg: JPEG
monet2.jpg: JPEG
redhat.jpg: JPEG
zelda1.jpg: JPEG

Таким образом, zsh справляется со своей задачей лучше, чем bash с обозначением () и так же, как и в bash с обозначением {}.

В bash для поиска я получаю

file *.(jp*|png|webp)
bash: syntax error near unexpected token `('

и

file "*.{jp*,png,webp}"
*.{jp*,png,webp}: cannot open `*.{jp*,png,webp}' (No such file or directory)

и

Для zsh для поиска я получаю

file *.(jp*|png|webp)

barn.jpg:     JPEG image data, JFIF standard 1.01, resolution (DPCM), density 28x28, segment length 16, comment: "bdh 11110000110100001100100011001010110110011100100101001101011011101010101010101011100111011001101001110000011111000101110010", baseline, precision 8, 400x299, components 3
image.png:    PNG image data, 314 x 88, 8-bit/color RGBA, non-interlaced
lena.jpg:     JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 256x256, components 3
lena.png:     PNG image data, 256 x 256, 8-bit/color RGB, non-interlaced
mandril3.jpg: JPEG image data, JFIF standard 1.01, resolution (DPCM), density 28x28, segment length 16, baseline, precision 8, 256x256, components 3
monet2.jpg:   JPEG image data, baseline, precision 8, 265x333, components 3
redhat.jpg:   JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, baseline, precision 8, 254x255, components 3
zelda1.jpg:   JPEG image data, JFIF standard 1.01, resolution (DPCM), density 28x28, segment length 16, baseline, precision 8, 256x256, components 3

и

file "*.{jp*,png,webp}"

*.{jp*,png,webp}: cannot open `*.{jp*,png,webp}' (No such file or directory)

Не могли бы вы также протестировать с помощью file ...? См. сводную таблицу, которую я добавил.

user22996855 06.05.2024 22:02

См. добавленную информацию в моем ответе.

fmw42 07.05.2024 00:12

Я ответил там. Также обратите внимание, что синтаксис {} должен быть в кавычках: file "*.{format1,format2,format3}"

user22996855 07.05.2024 00:32

Я исправил свой ответ за кавычки и возвращаемые значения.

fmw42 07.05.2024 02:07

Если вы пометите свой вопрос bash и zsh, это сбивает с толку; если вам нужны ответы на обе оболочки, задайте два вопроса. Для зш я бы просто написал magick identify -format "%f: %m\n" *.{jp*,png,webp}(N). (N) гарантирует, что он будет работать, даже если у вас нет файлов этого типа.

user1934428 07.05.2024 08:00

@user1934428 user1934428 Спасибо, приятно знать. Извините, что пометил мой вопрос тегами bash и zsh. Согласен, иногда это может сбивать с толку.

user22996855 07.05.2024 09:28

У меня эта команда возвращает ошибку в bash и zsh на моем Mac. magick identify -format "%f: %m\n" *.{jp*,png,webp}(N) bash: syntax error near unexpected token `('

fmw42 07.05.2024 17:27

Теперь у нас есть две аккуратные сравнительные таблицы, см. выше.

user22996855 08.05.2024 12:40

Другие вопросы по теме