A resposta curta é "Sim".
xargs -I{} cmd
permite várias ocorrências da cadeia de substituição especificada, mas fornecerá apenas um item de entrada por execução de cmd
, significando no exemplo a seguir, echo
será invocado três vezes:
$ mkdir t
$ cd t
$ touch foo bar baz
$ find . -type f | xargs -I{} echo {} {}
./bar ./bar
./baz ./baz
./foo ./foo
Observe 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 que ele lida com nomes de arquivos com espaço em branco por padrão ( para manipular o espaço em branco embutido corretamente com o último, use find -print0 | xargs -0
).
find -exec cmd {} +
passará vários itens de entrada para cmd
, mas apenas uma ocorrência da sequência de substituição ( {}
) será permitida. Esse também é o comportamento padrão de xargs
sem -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
, significando cmd
chamado várias vezes, mas muito menos do que uma vez por item de entrada):
$ find . -type f -exec echo {} +
./bar ./baz ./foo
$ find . -type f | xargs echo
./bar ./baz ./foo