Следующая команда работает нормально:
find . -iname \*.7z -exec ls {} -al \;
Но пока я изменяю \;
на \+
, то есть:
find . -iname \*.7z -exec ls {} -al \+
Я получил сообщение об ошибке:
missing argument to `-exec'
Я обнаруживаю, когда меняю позицию {}
:
find . -iname \*.7z -exec ls -al {} \+
Приведенная выше команда может работать нормально.
Я смущен этим.
+
форма -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
. Обратите внимание также, что Вы не должны заключать в кавычки +
, с тех пор, в отличие от этого, ;
, оболочки не рассматривают +
символ особенно.