No se necesitan pipes, xargs, exec ni nada:
find . -name .svn -delete
Editar: Es broma, evidentemente -delete
llamadas unlinkat()
bajo el capó, por lo que se comporta como unlink
o rmdir
y se negará a operar en directorios que contengan archivos.
Lo que escribió envía una lista de nombres de archivo (y rutas) separados por saltos de línea a rm
, pero rm no sabe qué hacer con esa entrada. Solo espera parámetros de línea de comando.
xargs
toma entradas, generalmente separadas por nuevas líneas, y las coloca en la línea de comando, por lo que agregar xargs hace que funcione lo que tenía:
find . -name .svn | xargs rm -fr
xargs
es lo suficientemente inteligente como para pasar tantos argumentos a rm
como puede aceptar. Por lo tanto, si tuviera un millón de archivos, podría ejecutar 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 hábilmente, 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
ambos formularios llaman rm
por cada carpeta que se elimina, por lo que si tiene 1 000 000 de carpetas, rm
sería invocado 1.000.000 de veces. Esto es ciertamente menos que ideal. Implementaciones más recientes de rm
le permite concluir el comando con un +
indicando 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 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
o la aplicación que se está ejecutando.
Además, hay un -execdir
que ejecutará rm
desde el directorio en el que se encontró el archivo, en lugar del directorio base y un -depth
eso comenzará primero en profundidad.
Prueba esto:
find . -name .svn -exec rm -rf '{}' \;
Antes de ejecutar un comando como ese, a menudo me gusta ejecutar este primero:
find . -name .svn -exec ls '{}' \;