Apenas além de fredtantini e como um esclarecimento geral (já que os documentos são um pouco confusos):
O xargs -I {}
pegará os caracteres '{}' da entrada padrão e os substituirá pelo que vier do cano. Isso significa que você pode substituir {}
por qualquer combinação de caracteres (talvez para melhor adequar seu sabor de programação preferido). Por exemplo : xargs -I % sh -c "echo %"
. Se você sempre usar o xargs -I {}
, poderá substituí-lo por xargs -i
, pois é a abreviação.
O sh -c
dirá ao seu bash / shell para ler o próximo comando de uma string e não da entrada padrão. Portanto, escrever sh -c "echo something"
é equivalente a echo something
.
O xargs -I {} sh -c "echo {}"
lerá a entrada criada com sh -c
, que é echo {}
. Desde que você disse para substituir {}
com os argumentos que você obteve do pipe, é o que acontecerá.
Você pode facilmente testar isso mesmo sem canalizar, basta digitar o comando acima em um terminal. Tudo o que você escrever em seguida será enviado para o terminal (Ctrl-D para sair).
No comando ls -la {}
, a mesma coisa acontece novamente. O {}
é substituído pelo conteúdo do comando pré-pipe.