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 -fr
para eliminar los directorios y su contenido?
find
rm
subversion
Arnaud
fuente
fuente
-delete
opción.-exec rm -r "{}" \;
al final de la búsqueda: ¡tenga cuidado al usarlorm -r
! :)-name ".svn"
solo coincide con el.svn
directorio en sí y no con los archivos ubicados en el.svn
directorio.-exec
con comillas"{}"
).Respuestas:
Buscar puede ejecutar argumentos con la
-exec
opció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-r
con elrm
comando para lograrlo.Para su ejemplo, puede emitir:
También puede decirle a find que solo busque directorios llamados .svn agregando un
-type d
cheque:Advertencia Use
rm -r
con 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
-delete
y-empty
:fuente
-type
después-name
en los comandos de búsqueda, ya que las llamadas astat
para 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 d
tomó 19 segundos, mientras quefind . -type d -name 'foo'
tomó 32 segundos. Entonces, aproximadamente un 50% más de tiempo para correr-type
primero.find
quiere 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
-depth
argumento 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 comofind
terminador de comando es optimizar el uso de la CPU. Eso puede ser significativo si tiene muchos.svn
subdirectorios:Tenga en cuenta también que nunca 1 necesita citar las llaves aquí.
1 A menos que use el
fish
caparazó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
-delete
opció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
--depth
opció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-f
indicador (force) con rm.fuente
find . -name "to-delete" -print0 | xargs -r0 -- rm -r
es una versión a prueba de fallas que no se bloquea en los espacios-prune
.-prune
para 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 long
Descubrí que la
-delete
acción funciona bien con la-path
prueba. Por ejemplo, lo siguiente debería funcionar en el problema de los carteles originales:fuente
-delete
implica-depth
, y seguro elimina directorios no vacíos en mi sistema.