Uma diferença é que, ao usar substituição de comando em vez de um canal, o tamanho dos dados transmitidos é limitado pelo tamanho do buffer de comando, portanto, ele é truncado em alguns casos sem aviso. Isso também significa que toda a saída do comando deve ser produzida e armazenada na memória antes de ser passada para o próximo comando; portanto, para saídas grandes, você pode usar muito mais memória do que o necessário.
Outro problema com o primeiro método é que a saída é dividida em espaço em branco, portanto, você não pode manipular nomes de arquivos com espaços neles. xargs
também é afetado pelo problema de espaço em branco, mas pode ser corrigido alterando o delimitador usado. Para tratar adequadamente os nomes de arquivos, a propósito, você precisaria usar o byte nulo como um delimitador no segundo exemplo.
Uma terceira questão é que os globs são expandidos; portanto, se um arquivo tiver asteriscos ou pontos de interrogação em seu nome, haverá resultados inesperados.
Você pode encontrar uma boa discussão sobre o assunto aqui: http://mywiki.wooledge.org/ParsingLs
A sintaxe correta seria
echo rm *
ou se você deve usar xargs,
find . -maxdepth 1 -print0 | xargs -0 echo rm
Remova echo
quando a saída parecer correta.
xargs
também é executado em um subshell devido ao pipe, a menos que você ativeshopt -s lastpipe
; nesse caso, ele será executado no shell atual. Eu não acho que a execução em um subshell seja um problema, neste caso, pois você não está alterando nenhuma variável.-l
bandeira, comofind . -maxdepth 1 -print0 | xargs -0 -l rm
. Para a segunda pergunta, você não pode usarls
comxargs -0
porque ls não dividir a saída do bute nulo, mas com novas linhas (que são válidos em nomes de arquivos BTW)-0
opção sofre com a questão de espaço em branco.man xargs
, useecho
para teste, nãorm
.xargs
nos permite exceder os limites do shell (algum buffer é limitado a 65 K, uma lista de nomes de arquivos não é).xargs --show-limits
e você vai ver o limite que está definido no seu sistema,