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).