143 votos

Cómo quitar todos los directorios .svn de directorios de mi aplicación

Una de las misiones de una herramienta de exportación que tengo en mi aplicación, es limpiar todo .svn directorios de mi árbol de directorio de aplicación. Estoy buscando un comando recursivo en el shell de Linux que atraviesan todo el árbol y eliminar la .svn archivos.

No estoy usando la exportación, como este guión se utilizará para algunos otros nombres de archivos/directorios que no están relacionados con SVN. He intentado algo así como:

find . -name .svn | rm -fr

No funcionó...

337voto

Greg Puntos 2980

Pruebe esto:

find . -name .svn -exec rm -rf {} \;

Antes de ejecutar un comando que, a menudo me gusta hacer esto primero:

find . -name .svn -exec ls {} \;

40voto

Kaleb Pederson Puntos 22428

Lo que usted escribió envía una lista de newline separados nombres de archivo (y caminos) rm, rm, pero no sabe qué hacer con esa entrada. Es sólo esperando parámetros de línea de comandos.

xargs toma de entrada, generalmente separados por saltos de línea y los coloca en la línea de comandos, así que la adición de xargs hace lo que había trabajo:

find . -name .svn | xargs rm -fr

xargs es lo suficientemente inteligente, ya que sólo pasan tantos argumentos rm como se puede aceptar. Por lo tanto, si usted tiene un millón de archivos, puede ejecutar rm 1,000,000/65,000 veces (si su shell podría aceptar 65,002 argumentos en la línea de comandos {65k archivos + 1 para rm + 1-fr}).

Como las personas tienen hábilmente se señaló, también el siguiente trabajo:

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 llame rm para cada una de las carpetas se eliminan, por lo que si había 1.000.000 de carpetas, rm podría ser invocada 1.000.000 de veces. Esto ciertamente es menos que ideal. Nuevas implementaciones de rm permiten concluir que el comando con un + lo que indica que rm aceptará como muchos argumentos como sea posible:

find . -name .svn -exec rm -rf {} +

El último hallazgo/xargs versión utiliza print0, lo que hace que encontrar generar una salida que utiliza \0 como un terminator en lugar de una nueva línea. Desde POSIX permitir que los sistemas de cualquier carácter, pero \0 en el nombre de archivo, esta es realmente la forma más segura para asegurarse de que los argumentos se pasan correctamente para rm o la aplicación que se está ejecutando.

Además, hay un -execdir ejecución rm desde el directorio en el que se encontró el archivo, en lugar de en el directorio base y un -depth que comenzará a profundidad en primer lugar.

29voto

alberge Puntos 2771

Sin necesidad de tubos, xargs, exec o algo:

find . -name .svn -delete

Editar: Es broma, evidentemente -delete llamadas unlinkat() bajo el capó, así se comporta como unlink o rmdir y se negarán a operar en directorios que contienen archivos.

9voto

soulmerge Puntos 37314

Casi lo tenía. Si usted quiere pasar la salida de un comando como parámetros a otra, tendrás que usar xargs. Agregar -print0 asegura que el script puede manejar rutas con espacios en blanco:

find . -type d -name .svn -print0|xargs -0 rm -rf

6voto

Nathan Taylor Puntos 13582

En Windows, necesitas el siguiente script de registro para agregar "Eliminar carpetas de SVN" a su menú contextual click derecho. Ejecutarlo en cualquier directorio que contiene los archivos molestos.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X