Почему find -exec принимает только {} в некоторых позициях?

Следующая команда работает нормально:

find . -iname \*.7z -exec ls {} -al \;

Но пока я изменяю \; на \+, то есть:

find . -iname \*.7z -exec ls {} -al \+

Я получил сообщение об ошибке:

missing argument to `-exec'

Я обнаруживаю, когда меняю позицию {}:

find . -iname \*.7z -exec ls -al {} \+

Приведенная выше команда может работать нормально.

Я смущен этим.

3
задан 26 August 2019 в 19:05

1 ответ

+ форма -exec всегда аргументы мест в конце команды Вы даете. Поэтому {}, то, которое представляет аргументы, должно сразу предшествовать +. Это отличается от ; форма -exec, который выполняет одну команду на найденный файл и использует имя файла везде, где {} появляется.

Таким образом, это - Ваш ответ..., но он действительно поднимает дополнительный вопрос того, почему то ограничение существует во-первых, который немного более темен.

С +, -exec действие выполняет Вашу команду, так же мало раз столь же возможную, передавая столько имен файлов, сколько это может вместо {}. Особенно, если могло бы быть много найденных файлов, эта форма -exec только подходит для использования с командами, которые ведут себя то же - или по крайней мере в некотором роде согласовывающийся с тем, что Вы хотите - когда имена файлов разделяются через несколько вызовов команды, как они делают, когда все имена файлов появляются в единственном вызове.

Команды, которые принимают переменное количество аргументов имени файла в единственном вызове, для произведения того же эффекта, как будто команда выполнялась однажды для каждого имени файла, часто принимают их как запаздывание аргументов. Существуют, конечно, исключения как cp и mv с целями каталога (хотя можно передать -t dir заставить их работать с +). Это также несколько легче обосновать о в этом, когда Вы пишете ls -l сопровождаемый именами файлов, похоже ls -l "команда", Вы работаете для работы на те именованные файлы, но когда Вы пишете ls, сопровождаемый именами файлов, сопровождаемыми -l, это не вполне чувствует тот путь.

Что касается того, что делать с этим, Ваш подход простого помещения опций как -l перед {} хорошо. Это имеет дополнительные преимущества: хотя менее распространенный в системах GNU/Linux как Ubuntu, чем в некоторых других подобных Unix операционных системах, некоторые команды не принимают опции после того, как аргумент неопции появился. (См. getopt (3) для деталей.)

Так как Вы работаете ls, Вы могли бы рассмотреть использование find -ls действие вместо -exec. Обратите внимание также, что Вы не должны заключать в кавычки +, с тех пор, в отличие от этого, ;, оболочки не рассматривают + символ особенно.

4
ответ дан 1 December 2019 в 15:48

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

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