4

По словам man find опция -exec должна заканчиваться ; ,

Выражение должно заканчиваться точкой с запятой (``; '').

Но когда я использую find-grep в Emacs, выражение заканчивается на + . Какой я должен использовать? Есть ли разница двух выражений?

2 ответа2

6

Это из руководства для GNU find:

   -exec command ;
          Execute command; true if 0 status is returned.
          All following arguments to find are  taken  to
          be  arguments to the command until an argument
          consisting of `;'

Отключи меня. Но у нас также есть:

   -exec command {} +
          This variant of  the  -exec  action  runs  the
          specified  command  on the selected files, but
          the command line is built  by  appending  each
          selected  file name at the end; the total num‐
          ber of invocations of the command will be much
          less  than  the  number of matched files.  The
          command line is built in  much  the  same  way
          that xargs builds its command lines.

Отключи меня.

; и + делать разные вещи. Краткий пример кода для демонстрации:

$ mkdir test
$ touch test/{a,b}
$ find test -exec echo foo {} \;
foo test
foo test/a
foo test/b
$ find test -exec echo foo {} +
foo test test/a test/b

+ генерирует только один вызов со всеми соответствующими файлами, представленными в виде списка аргументов (на практике он ведет себя как xargs). ; выполняет команду один раз для каждого файла соответствия ; должно быть экранированы в оболочке, поэтому предыдущий \

Обратите внимание, что в некоторых версиях find отсутствует опция + , но версия GNU, скорее всего, установлена на любом не встроенном Linux.

4

TL; DR:

Использование + in -exec аналогично -exec, за исключением того, что {} заменяется как можно большим количеством путей для каждого вызова утилиты.


Чуть дольше от man find на моем компьютере:

   -exec utility [argument ...] ;
             True if the program named utility returns a zero value
             as its exit status.  Optional arguments may be passed
             to the utility.
             The expression must be terminated by a semicolon.  If you
             invoke find from a shell you may need to quote the 
             semicolon if the shell would otherwise treat it as a control
             operator.  If the string ``{}'' appears anywhere in the 
             utility name or the arguments it is replaced by the pathname
             of the current file.
             Utility will be executed from the directory from which find was
             executed.  Utility and arguments are not subject to the further
             expansion of shell patterns and constructs.


     -exec utility [argument ...] {} +
             Same as -exec, except that `{}` is replaced with as many 
             pathnames as possible for each invocation of utility.  
             This behaviour is similar to that of xargs(1).

Обратите внимание на второй абзац. Не прекращайте читать после первого абзаца, объясняющего -exec.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .