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
xargs
es lo suficientemente inteligente como para pasarle tantos argumentos rm
como pueda aceptar. Por lo tanto, si tuviera un millón de archivos, podría ejecutarse rm
1,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 -exec
formularios requieren rm
que se elimine cada carpeta, por lo que si tuviera 1,000,000 de carpetas, rm
se invocaría 1,000,000 de veces. Esto es ciertamente menos que ideal. Las implementaciones más recientes de le rm
permiten concluir el comando con una +
indicación que rm
aceptará 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 \0
como un terminador en lugar de una nueva línea. Dado que los sistemas POSIX permiten cualquier carácter excepto \0
en el nombre del archivo, esta es realmente la forma más segura de asegurarse de que los argumentos se pasen correctamente a rm
la aplicación o se ejecute.
Además, hay una -execdir
que se ejecutará rm
desde el directorio en el que se encontró el archivo, en lugar de hacerlo en el directorio base y una -depth
que comenzará primero en profundidad.