Por que há uma diferença na saída entre usar
find . -exec ls '{}' \+
e
find . -exec ls '{}' \;
Eu tenho:
$ find . -exec ls \{\} \+
./file1 ./file2
.:
file1 file2 testdir1
./testdir1:
testdir2
./testdir1/testdir2:
$ find . -exec ls \{\} \;
file1 file2 testdir1
testdir2
./file2
./file1
+
associado a-exec
sempre é escapado, mas+
associado a-mtime
não é. você sabe a razão? Eu acho que é hábito de escapar;
associado-exec
.;
. Não pode imaginar nunca ser necessário escapar+
Todas as respostas até agora estão corretas. Ofereço isso como uma demonstração mais clara (para mim) do comportamento descrito usando, em
echo
vez dels
:Com um ponto e vírgula, o comando
echo
é chamado uma vez por arquivo (ou outro objeto do sistema de arquivos) encontrado:Com um sinal de adição, o comando
echo
é chamado apenas uma vez. Todo arquivo encontrado é passado como argumento.Se
find
aparecer um grande número de resultados, você pode achar que o comando que está sendo chamado bloqueia o número de argumentos.fonte
xargs
faz ... em princípio, nunca se engasga com muitos argumentos.find
(exargs
) no Solaris emitir mais argumentos do que poderia ser consumido. Oxargs
(efind
) nos findutils do GNU` parecem se comportar de maneira mais sensata, mas nem todos usam o GNU.find
tentariam evitar atingir o limite do número de argumentos. E isso inclui o Solaris (pelo menos 10). Onde pode falhar é se você fizer algo comofind ... -exec ksh -c 'cmd "$@" "$@"' sh {} +
oufind ... -exec ksh -c 'files="$*" cmd "$@"' sh {} +
, masfind
realmente não pode ser responsabilizado por isso. Observe que o GNUfind
foi uma das últimasfind
implementações a oferecer suporte+
(costumava ser um problema para portar scripts para sistemas GNU).De
man find
:comando -exec;
comando -exec {}
Portanto, pelo que entendi,
\;
executa um comando separado para cada arquivo encontrado porfind
, enquanto\+
anexa os arquivos e executa um único comando em todos eles. O\
é um caractere de escape, então é:vs
Fazer o acima no meu shell espelhava a saída na sua pergunta.
exemplo de quando você gostaria de usar
\+
Suponha dois arquivos
1.tmp
e2.tmp
:1.tmp:
2.tmp:
Com
\;
:Considerando que se você usar
\+
(para concatenar os resultados defind
):Portanto, neste caso, é a diferença entre
diff 1.tmp; diff 2.tmp
ediff 1.tmp 2.tmp
Há casos em que
\;
é apropriado e\+
será necessário. O uso de\+
withrm
é uma instância em que, se você estiver removendo um grande número de arquivos, o desempenho (velocidade) será superior\;
.fonte
find
tem sintaxe especial. Você usa o{}
que é porque eles têm significado para encontrar como o nome do caminho do arquivo encontrado e (a maioria) os shells não os interpretam de outra maneira. Você precisa da barra invertida\;
porque o ponto e vírgula tem significado para o shell, que o consome antes quefind
possa obtê-lo. Então, o que vocêfind
quer ver APÓS o shell ser feito, na lista de argumentos passada para o programa C, émas você precisa
\;
na linha de comando para obter um ponto-e-vírgula através do shell para os argumentos.Você pode se safar
\{\}
porque a interpretação de shell-quote\{\}
é justa{}
. Da mesma forma, você pode usar '{}'.O que você não pode fazer é usar
porque o shell interpreta isso como um argumento,
e
rm {} ;
não é o nome de um comando. (Pelo menos, a menos que alguém esteja realmente brincando.)Atualizar
a diferença é entre
e
O
+
está catenando os nomes em uma linha de comando.fonte
A diferença entre
;
(ponto e vírgula) ou+
(sinal de mais) é como os argumentos são passados para o parâmetro-exec
/ localização-execdir
. Por exemplo:using
;
executa vários comandos (separadamente para cada argumento),Exemplo:
using
+
executa os comandos menos possíveis (como os argumentos são combinados). É muito semelhante à forma como oxargs
comando funciona, portanto, ele usará o maior número possível de argumentos por comando para evitar exceder o limite máximo de argumentos por linha.Exemplo:
Veja também:
man find
fonte
estávamos tentando encontrar arquivos para tarefas domésticas.
encontrar . -exec echo {} \; comando correu durante a noite no final sem resultado.
encontrar . -exec eco {} \ + tem resultados e levou apenas algumas horas.
Espero que isto ajude.
fonte