Emito el siguiente comando para encontrar los directorios .svn:
find . -name ".svn"
Eso me da los siguientes resultados:
./toto/.svn
./toto/titi/.svn
./toto/tata/.svn
¿Cómo podría procesar todas estas líneas rm -frpara eliminar los directorios y su contenido?
find
rm
subversion
Arnaud
fuente
fuente

-deleteopción.-exec rm -r "{}" \;al final de la búsqueda: ¡tenga cuidado al usarlorm -r! :)-name ".svn"solo coincide con el.svndirectorio en sí y no con los archivos ubicados en el.svndirectorio.-execcon comillas"{}").Respuestas:
Buscar puede ejecutar argumentos con la
-execopción para cada coincidencia que encuentre. Es un mecanismo recomendado porque puede manejar rutas con espacios / líneas nuevas y otros caracteres correctamente. Tendrá que eliminar el contenido del directorio antes de poder eliminar el directorio en sí, así que úselo-rcon elrmcomando para lograrlo.Para su ejemplo, puede emitir:
También puede decirle a find que solo busque directorios llamados .svn agregando un
-type dcheque:Advertencia Use
rm -rcon precaución para eliminar la carpeta y todo su contenido.Si desea eliminar solo directorios vacíos, así como directorios que contienen solo directorios vacíos, find puede hacerlo por sí mismo
-deletey-empty:fuente
-typedespués-nameen los comandos de búsqueda, ya que las llamadas astatpara obtener el tipo son caras. Lo probé yo mismo en un grupo bastante grande de archivos, y parece ser cierto: la ejecuciónfind . -name 'foo' -type dtomó 19 segundos, mientras quefind . -type d -name 'foo'tomó 32 segundos. Entonces, aproximadamente un 50% más de tiempo para correr-typeprimero.findquiere ver en esa carpeta otras coincidencias, mientras elimina la carpeta al mismo tiempo. ~ Todavía no sé cómo solucionar esto. ~ Solución sucia:find . -name "folder-to-delete" -print0 | xargs -r0 -- rm -r-depthargumento arregla esto:find . -depth -name ".svn" -type d -exec rm -r "{}" \;Aquí hay una portátil aún más rápida que la respuesta aceptada.
Usar un
+punto y coma en lugar de punto y coma comofindterminador de comando es optimizar el uso de la CPU. Eso puede ser significativo si tiene muchos.svnsubdirectorios:Tenga en cuenta también que nunca 1 necesita citar las llaves aquí.
1 A menos que use el
fishcaparazón.fuente
+no reducir el uso de la CPU, el uso de;no dar lugar a un comando de error demasiado largo.Suponga que está usando gnu find , puede usar la
-deleteopción:que es más fácil de recordar
fuente
En mi computadora cuando uso:
Los directorios se eliminan pero me sale el error:
para cada directorio
Mis directorios no están vacíos, por lo que la opción -delete no funcionará para mí. Encontré la razón de este comportamiento aquí :
En su lugar, usé esto para evitar:
Tenga en cuenta que find todavía intentará volver a aparecer en directorios llamados dirname, lo cual no es realmente necesario y tomará algo de tiempo adicional. Dependiendo de la estructura de su directorio, es posible que pueda solucionar esto con la
--depthopción de búsqueda. Además, si tiene una estructura de directorio como dirname / foo / dirname, obtendrá errores de "No existe tal archivo o directorio" de rm. Para suprimir los errores, puede redirigir stderr a / dev / null o usar el-findicador (force) con rm.fuente
find . -name "to-delete" -print0 | xargs -r0 -- rm -res una versión a prueba de fallas que no se bloquea en los espacios-prune.-prunepara evitar el error "No existe tal archivo o directorio".Una forma más rápida de hacer esto es:
En caso de que tenga ".svn" dentro de otro ".svn".
fuente
Solución específica de Bash:
fuente
bash: /bin/rm: Argument list too longDescubrí que la
-deleteacción funciona bien con la-pathprueba. Por ejemplo, lo siguiente debería funcionar en el problema de los carteles originales:fuente
-deleteimplica-depth, y seguro elimina directorios no vacíos en mi sistema.