Чтобы проверить правильность расширений имен файлов моих изображений, то есть действительно ли мои файлы 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)
Что означают v, - и ? имеется в виду в твоей таблице?
@fmw42 V в нижнем регистре означает галочку (то есть синтаксис поддерживается); дефис означает тире (то есть синтаксис не поддерживается). Знаки вопроса — это то, что я не могу проверить сам (и в чем я прошу вас мне помочь).
@ jsx97 magick identify *.{jpg,png}
у меня работает в bash и создает обычный список файлов JPG и PNG. У меня нет файлов WEBP в этом каталоге.
На моем 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 ...
? См. сводную таблицу, которую я добавил.
См. добавленную информацию в моем ответе.
Я ответил там. Также обратите внимание, что синтаксис {}
должен быть в кавычках: file "*.{format1,format2,format3}"
Я исправил свой ответ за кавычки и возвращаемые значения.
Если вы пометите свой вопрос bash и zsh, это сбивает с толку; если вам нужны ответы на обе оболочки, задайте два вопроса. Для зш я бы просто написал magick identify -format "%f: %m\n" *.{jp*,png,webp}(N)
. (N)
гарантирует, что он будет работать, даже если у вас нет файлов этого типа.
@user1934428 user1934428 Спасибо, приятно знать. Извините, что пометил мой вопрос тегами bash
и zsh
. Согласен, иногда это может сбивать с толку.
У меня эта команда возвращает ошибку в bash и zsh на моем Mac. magick identify -format "%f: %m\n" *.{jp*,png,webp}(N) bash: syntax error near unexpected token `('
Теперь у нас есть две аккуратные сравнительные таблицы, см. выше.
*.{jp*,png,webp}
расширяется как с помощью bash, так и с помощью zsh до*.jp* *.png *.webp
перед расширением имени файла. Если один из этих шаблонов не соответствует ни одному файлу, поведение zsh (может быть, и bash тоже?) по умолчанию вызывает ошибку. Обе оболочки имеют параметры для точного управления поведением.