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

1

Normalmente, xargsagrupa tudo, mas quando usado com a -Ibandeira parece colocar tudo como uma única linha. Isso significa que ele perde sua vantagem de velocidade? Além disso, se a -exec cmd {}sintaxe + for usada, isso significa que ela terá um desempenho melhor que xargs -I?

m0meni
fonte
possível duplicata de diferença entre xargs / bin / ls e exec ls?
JakeGould

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
zackse
fonte