Uma diferença é que ao usar a 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, é possível 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 manipular corretamente nomes de arquivos, você precisaria usar o byte nulo como um delimitador no segundo exemplo.
Um terceiro problema é 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: link
A sintaxe correta seria
echo rm *
ou se você precisar usar xargs,
find . -maxdepth 1 -print0 | xargs -0 echo rm
Remova echo
quando a saída parece correta.