Lo que escribió envía una lista de nombres de archivo separados por nueva línea (y rutas) rm, pero rm no sabe qué hacer con esa entrada. Solo espera parámetros de línea de comando.
xargs toma datos, generalmente separados por líneas nuevas, y los coloca en la línea de comando, por lo que agregar xargs hace que lo que haya funcionado
find . -name .svn | xargs rm -fr
xargses lo suficientemente inteligente como para pasarle tantos argumentos rmcomo pueda aceptar. Por lo tanto, si tuviera un millón de archivos, podría ejecutarse rm1,000,000 / 65,000 veces (si su shell pudiera aceptar 65,002 argumentos en la línea de comando {65k archivos + 1 para rm + 1 para -fr}).
Como las personas han señalado con destreza, lo siguiente también funciona:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
Los dos primeros -execformularios requieren rmque se elimine cada carpeta, por lo que si tuviera 1,000,000 de carpetas, rmse invocaría 1,000,000 de veces. Esto es ciertamente menos que ideal. Las implementaciones más recientes de le rmpermiten concluir el comando con una +indicación que rmaceptará tantos argumentos como sea posible:
find . -name .svn -exec rm -rf {} +
La última versión de find / xargs usa print0, lo que hace que find genere una salida que se usa \0como un terminador en lugar de una nueva línea. Dado que los sistemas POSIX permiten cualquier carácter excepto \0en el nombre del archivo, esta es realmente la forma más segura de asegurarse de que los argumentos se pasen correctamente a rmla aplicación o se ejecute.
Además, hay una -execdirque se ejecutará rmdesde el directorio en el que se encontró el archivo, en lugar de hacerlo en el directorio base y una -depthque comenzará primero en profundidad.