Se você está lidando apenas com alguns nomes de caminhos que não contêm espaço em branco, eles são equivalentes.
Em alguns sistemas, o comprimento máximo de uma única linha de comando (na verdade, ambiente mais argumentos enviados para uma chamada exec (2) -familiar) é limitado (veja kern.argmax). Em um sistema limitado, se find produzir muita saída, o shell não conseguirá encaixar tudo na linha de comando adjacente. Para corrigir isso, xargs pega a saída de find e combina as "palavras" (sim, palavras, não linhas, veja abaixo) em grupos que se encaixam em uma única linha de comando.
Segundo, xargs e o shell (via backticks) dividirão a saída de find nos argumentos para rm , tokenizando a saída em cada execução de qualquer combinação de espaço, tabulação ou caracteres de nova linha ( isso é uma simplificação, pois ambos têm suas próprias regras de cotação que são próximas, mas não idênticas). Se find -print s um nome de caminho de ".//foo/bar quux", rm acabará por ver dois argumentos (".//foo/bar" e "quux"). Se um arquivo chamado quux existisse no cwd do qual você começou, ele desapareceria quando tudo estivesse terminado (e “.//foo/bar quux” ainda estaria lá!).
Portanto, o método mais robusto é usar find -print0 e xargs -0 POSIX-extension. Trabalhando juntos, eles podem ser usados para transportar de forma robusta qualquer nome de caminho legal da saída de find para a linha de comando de qualquer outro comando em qualquer sistema que suporte as duas extensões.
find . -name foo\* | xargs -0 rm
A robustez vem do fato de que o byte NUL que ambas as extensões usam para finalizar nomes de caminho é o único byte não permitido em praticamente todos os SOs (Unix-oid).