find -exec deve terminar com \; ou +?

4

De acordo com a opção man find -exec, deve terminar com ; .

The expression must be terminated by a semicolon ('';'').

Mas quando eu uso find-grep no Emacs, a expressão termina com + . Qual deles devo usar? Existe diferença duas expressões?

    
por ironsand 11.09.2013 / 13:25

2 respostas

6

Isto é do manual para o 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 ';'

Cortado por mim. Mas também temos:

   -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.

Cortado por mim.

Portanto, ; e + fazem coisas diferentes. Um pequeno exemplo em código para demonstrar:

$ 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

+ gera apenas uma única chamada com todos os arquivos correspondentes dados como uma lista de argumentos (na prática, ela se comporta como xargs ). ; executa o comando uma vez para cada arquivo correspondente (o ; precisa ser salvo no shell; daí o \ precedente).

Note que algumas versões do find não possuem a opção + , mas a versão GNU provavelmente está instalada em qualquer coisa que não seja o Linux.

    
por 11.09.2013 / 13:36
4

TL; DR:

Usar o + em -exec é o mesmo que -exec, exceto que {} é substituído por tantos nomes de caminho quanto possível para cada invocação de utilitário .


Ligeiramente maior que man find no meu computador:

   -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).

Observe o segundo parágrafo. Não pare de ler depois do primeiro parágrafo explicando -exec.

    
por 11.09.2013 / 13:31

Tags