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
, ou seja, no exemplo a seguir, echo
será 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 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
, o que cmd
poderia 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