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 file
comando 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 file
ouxargs -I{} file {}
. Não deveria serxargs file {}
. Eu acho que ao especificar explicitamente -I {}, o bash o tratará comofile "Hello World"
. Sem -I {}, é tratado comofile Hello World
.-1
opçãols
, mas ela está ativada por padrão quando a saída dels
é um arquivo ou um canal, para que você não precise dela aqui. (3) Você está confuso-I
com a opção preterida-i
(minúsculaI
).-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 dizerfile *
?file
-los. Mas vim com um exemplo mais simples usandols
. Você está certo. Para isso,file *
é o melhor.-exec
.Respostas:
O
-I
requer um espaço reservado definido. A-i
opção assumirá{}
é o espaço reservado. Foi aqui que encontrei alguma suposição de {}man xargs
pelo menos no Cygwin e no CentOS.O xargs chamado sem nenhuma das opções não precisa do espaço reservado e apenas acrescenta o STDIN ao final dos argumentos.
Apenas adicione
echo
seus exemplos para ver o que o xargs está fazendo:Seu exemplo de engano usa
{}
:então o
file
cmd vê argumentos{} Hello World
e erros.Se você deseja usar explicitamente
{}
em sua chamada xargs:Ou sem espaço reservado:
xargs, como chamado acima, não precisa do {}. Ele anexa o STDIN ao final do comando sem um espaço reservado. O uso de {} geralmente significa que você deseja que o STDIN em algum lugar no meio do cmd seja executado, como em:
fonte