Existe alguma diferença entre -exec cmd {} e xargs -I?


Respostas:


3

A resposta curta é sim".

xargs -I{} cmdpermite várias ocorrências da cadeia de substituição especificada, mas fornecerá apenas um item de entrada por execução de cmd, ou seja, no exemplo a seguir, echoserá chamado três vezes:

$ mkdir t
$ cd t
$ touch foo bar baz

$ find . -type f | xargs -I{} echo {} {}
./bar ./bar
./baz ./baz
./foo ./foo

Note que se você não precisa especificar cada item de entrada mais de uma vez por linha de comando, find -exec cmd {} +é aproximadamente equivalente a find | xargs(sem -I), exceto por tratar nomes de arquivos com espaços em branco por padrão (para manipular corretamente espaços em branco com este último, use find -print0 | xargs -0).

find -exec cmd {} +irá passar vários itens de entrada para cmd, mas apenas uma ocorrência da cadeia de substituição ( {}) é permitida. Esse também é o comportamento padrão de xargssem -I. No exemplo a seguir, echoé chamado apenas uma vez para cada conjunto de argumentos (para grandes conjuntos de entrada, ambas as abordagens dividirão a entrada em blocos, de forma que cada linha de comando gerada seja menor que PATH_MAX, o que cmdpoderia ser chamado várias vezes, mas muito menos que uma vez por item de entrada):

$ find . -type f -exec echo {} +
./bar ./baz ./foo

$ find . -type f | xargs echo
./bar ./baz ./foo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.