Eu quero saber qual é a diferença entre isso
ls | xargs rm
ls | xargs -i{} rm {}
Ambos estão trabalhando para mim
Responder1
xargs rm
será invocado rm
com todos os argumentos como parâmetro com espaços.
xargs -i{} rm {}
será invocado rm {}
para cada um dos argumentos e {}
será substituído pelo argumento atual.
Se você tiver 2 argumentos a.txt
e b.txt
, xargs rm
chamará isso
rm a.txt b.txt
Mas xargs -i{} rm {}
vai ligar
rm a.txt
rm b.txt
Isso ocorre porque -i
opção implica -L 1
opção, o que significa que o comando rm
ocupará apenas 1
linha de cada vez. E aqui cada linha contém apenas 1 argumento.
Verifique issoLink idealpara ter mais ideia sobre isso.
Responder2
-i
A opção (equivalente a --replace
) cria uma espécie de espaço reservado onde xargs armazena a entrada que acabou de receber. No seu segundo comando, o espaço reservado é {}
, funciona como -exec
a opção find. Uma vez definido, xargs substituirá este espaço reservado por toda a linha de entrada. Se não gostar do {}
nome, você pode definir o seu próprio:
ls | xargs -iPLACEHOLDER echo PLACEHOLDER
No seu caso, ambos os comandos estão produzindo o mesmo resultado. Na segunda forma, você está apenas explicitando o comportamento padrão com a -I
opção.
Responder3
Com chaves, ele gerará um rm
processo por arquivo. Sem chaves, xargs
passará tantos nomes de arquivos quanto possível para cada rm
comando.
Comparar
ls | xargs echo
e
ls | xargs -I {} echo {}