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

1

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

    
por m0meni 19.02.2015 / 05:11

1 resposta

3

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
    
por 19.02.2015 / 05:50