Una de las misiones de una herramienta de exportación que tengo en mi aplicación es limpiar todos los .svndirectorios del árbol de directorios de mi aplicación. Estoy buscando un comando recursivo en el shell de Linux que atraviese todo el árbol y elimine los .svnarchivos.
No estoy usando exportar, ya que este script se usará para otros nombres de archivo / directorio que no están relacionados con SVN. Intenté algo como:
find . -name .svn | rm -fr
No funcionó ...

Respuestas:
Prueba esto:
Antes de ejecutar un comando como ese, a menudo me gusta ejecutar esto primero:
fuente
find . -name .svn -exec rm -rf '{}' \;find . -name .svn -exec echo {} \;{} \;hacer?ls, obtengoentries prop-base props text-base tmpresultados ...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.xargstoma 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 funcionadoxargses lo suficientemente inteligente como para pasarle tantos argumentosrmcomo pueda aceptar. Por lo tanto, si tuviera un millón de archivos, podría ejecutarserm1,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:
Los dos primeros
-execformularios requierenrmque se elimine cada carpeta, por lo que si tuviera 1,000,000 de carpetas,rmse invocaría 1,000,000 de veces. Esto es ciertamente menos que ideal. Las implementaciones más recientes de lermpermiten concluir el comando con una+indicación quermaceptará tantos argumentos como sea posible:La última versión de find / xargs usa print0, lo que hace que find genere una salida que se usa
\0como un terminador en lugar de una nueva línea. Dado que los sistemas POSIX permiten cualquier carácter excepto\0en el nombre del archivo, esta es realmente la forma más segura de asegurarse de que los argumentos se pasen correctamente armla aplicación o se ejecute.Además, hay una
-execdirque se ejecutarármdesde el directorio en el que se encontró el archivo, en lugar de hacerlo en el directorio base y una-depthque comenzará primero en profundidad.fuente
No hay necesidad de tuberías, xargs, exec ni nada:
Editar: es broma, evidentemente
-deletellamaunlinkat()bajo el capó, por lo que se comporta comounlinkormdiry se negará a operar en directorios que contengan archivos.fuente
-deleteno tocará un directorio si contiene archivos.-forceindicador recursivo para el-deletepredicado, por lo que esta respuesta es inútil. Por lo tanto, es hora de volver a|xargs rm -rf, que es menos feo que escribir a continuación,-execcon sus feas marcadores de posición y coma:-exec rm -rf '{}' \;.Ya hay muchas respuestas proporcionadas para eliminar el directorio .svn. Pero quiero agregar, que puede evitar estos directorios desde el principio, si realiza una exportación en lugar de un pago:
fuente
Si no te gusta ver mucho
advertencias, luego use el
-depthinterruptor:fuente
En Windows, puede usar el siguiente script de registro para agregar "Eliminar carpetas SVN" al menú contextual del botón derecho. Ejecútelo en cualquier directorio que contenga esos molestos archivos.
fuente
Casi lo tienes. Si desea pasar la salida de un comando como parámetros a otro, deberá usar xargs. Agregar
-print0asegura que el script pueda manejar rutas con espacios en blanco:fuente
fuente
Como un problema importante, cuando desea utilizar shell para eliminar carpetas .svn, necesita un argumento de profundidad para evitar que el comando find entre al directorio que acaba de eliminar y muestre mensajes de error como, por ejemplo,
Como resultado, puede usar el comando de búsqueda como a continuación:
fuente
Prueba esto:
Lea más sobre el comando find en developerWorks .
fuente
Alternativamente, si desea exportar una copia sin modificar la copia de trabajo, puede usar rsync:
fuente