Questão find -exec deve terminar com \; ou +?


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

A expressão deve ser terminada por um ponto e vírgula (``; '').

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


4


origem




Respostas:


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 `;'

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

Cortada por mim.

Assim, ; e + faça 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 invocação 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 escapado no shell; daí o precedente \).

Note que algumas versões de find falta o + opção, mas a versão GNU é provavelmente instalada em qualquer coisa não-embedded Linux.


6



Observe também o -execdir opção. Age como -exec, mas cria um comando separado para a pasta separada. É usado quando o comando de chamada pode ser confundido, iniciando na pasta errada. Você pode usar ; ou + (com o mesmo significado que para -exec-) com -execdir. - Paddy Landau
@DanielAndersson + nem sempre gera apenas uma invocação. Ele gera menos invocações do que ;. - nekketsuuu


TL; DR:

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


Um pouco mais de man find no meu computador:

   utilitário -exec [argumento ...];
             Verdadeiro se o programa chamado utility retornar um valor zero
             como o status de saída. Argumentos opcionais podem ser passados
             para o utilitário.
             A expressão deve ser terminada por um ponto e vírgula. Se vocês
             invocar encontrar a partir de um shell você pode precisar citar o
             ponto-e-vírgula se a casca iria tratá-lo como um controle
             operador. Se a string `` {} '' aparecer em qualquer lugar no
             nome do utilitário ou os argumentos é substituído pelo nome do caminho
             do arquivo atual.
             Utilitário será executado a partir do diretório a partir do qual foi encontrado
             executado. Utilidade e argumentos não estão sujeitos a mais
             expansão de padrões e construções de shell.


     Utilitário -exec [argumento ...] {} +
             O mesmo que -exec, exceto que `{}` é substituído por tantos
             pathnames quanto possível para cada invocação do utilitário.
             Esse comportamento é semelhante ao de xargs (1).

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


4