Pelo meu entendimento, o seguinte deve significar exatamente o mesmo:
ls -1 | xargs file {}
ls -1 | xargs -I{} file {}
se a opção -I não for especificada, é o padrão para -I {}.
Quero listar todos os arquivos no diretório atual e executar o filecomando em cada um deles. Alguns têm espaços em seus nomes. No entanto, notei a diferença. Ver abaixo:
$ ls -1
Hello World
$ ls -1 | xargs file {}
{}: ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory
Com -I {} especificado explicitamente, os espaços em branco nos nomes dos arquivos são tratados conforme o esperado.
xargs fileou xargs -I{} file {}. Não deveria ser xargs file {}. Eu acho que ao especificar explicitamente -I {}, o bash o tratará como file "Hello World". Sem -I {}, é tratado como file Hello World.
-1opção ls, mas ela está ativada por padrão quando a saída de lsé um arquivo ou um canal, para que você não precise dela aqui. (3) Você está confuso -Icom a opção preterida -i(minúscula I). -ifooé equivalente a -Ifoo, mas simples -ié equivalente a -I{}. Mas use -I{}. (4) Se você realmente quer fazer o que diz que quer, por que não dizer file *?
file-los. Mas vim com um exemplo mais simples usando ls. Você está certo. Para isso, file *é o melhor.
-exec.