Может ли кто-нибудь объяснить внутреннюю работу символов в конце этого bash: «_ {} \;»

Я выполнил следующую команду в оболочке для пакетного преобразования файлов .HEIC в файлы .JPG, команда выполнена успешно, однако есть ее часть, которую я не понимаю:

find . -name '*.HEIC' -exec sh -c 'magick convert $1 "${1%.HEIC}.JPG"' _ {} \;

Очевидно, _ {} позволяет назначить результат find на $1, но как? Я не могу найти объяснения ни в Google, ни здесь, и мне не повезло с man find. Вполне возможно, что ответы были здесь, но эти символы не очень удобны для поиска.

Итак, вопрос в том, как _ {} присваивает переменную $1? Можно ли присвоить ему несколько переменных с помощью команды find / или других команд?

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

Ответы 1

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

Есть две вещи, связанные с тем, как _ {} назначает имя файла $1. Во-первых, вот как работает find-exec: он запускает следующие аргументы (вплоть до экранированного ;) как команду, но с заменой {} на путь к найденному файлу. Таким образом, если он найдет ./somefile.HEIC, он запустит эквивалент команды:

sh -c 'magick convert $1 "${1%.HEIC}.JPG"' _ ./somefile.HEIC

Вторая часть - это команда sh. sh может делать несколько вещей, но если ему задана опция -c, он принимает следующий за ним аргумент (magick convert $1 "${1%.HEIC}.JPG") в качестве командной строки для синтаксического анализа и запуска, что-то вроде небольшого мини-скрипта. Аргументы после этого принимаются как аргументы этого мини-скрипта, начиная с $0. В данном случае это означает, что он запускает мини-сценарий с $0, установленным на _, и $1, установленным на "./somefile.HEIC". Если бы было предоставлено больше аргументов, это были бы $2, $3 и т. д.

Спасибо, это очень понятно и полезно. Означает ли это, что _ не требуется, и вместо этого я могу просто использовать $ 0? Есть ли польза от использования 1 доллара?

Rocky Li 10.11.2018 06:15

Кроме того, если я не ошибаюсь, команда запускает один дочерний / мини-скрипт для каждого файла, возвращенного из find.

Inian 10.11.2018 06:30

@Inian Верно по обоим пунктам. Вы можете использовать $0 для передачи имени файла, но $0 обычно является именем выполняемой программы (скрипта, исполняемого файла и т. д.), И его использование в качестве файла, с которым выполняется операция, может привести к некоторой путанице. ("_" тоже не очень хорошее название программы, но, по крайней мере, оно не вводит в заблуждение.) Что касается запуска мини-скрипта для каждого файла, вот как работает -exec ... \;. Если вы используете -exec ... +, он будет запускать их большими партиями, поэтому имена файлов будут $1, $2, ... ${148} или любые другие. Вы можете это сделать, но тогда вам понадобится цикл обработки в мини-скрипте.

Gordon Davisson 10.11.2018 07:02

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