linux - eliminar - comandos svn
Cómo eliminar todos los directorios.svn de mis directorios de aplicaciones (11)
Alternativamente, si quiere exportar una copia sin modificar la copia de trabajo, puede usar rsync:
rsync -a --exclude .svn path/to/working/copy path/to/export
Una de las misiones de una herramienta de exportación que tengo en mi aplicación es limpiar todos los directorios .svn
del árbol de directorios de mi aplicación. Estoy buscando un comando recursivo en el shell de Linux que recorra todo el árbol y elimine los archivos .svn
.
No estoy usando exportar, ya que este script se usará para otros nombres de archivos / directorios que no están relacionados con SVN. Intenté algo como:
find . -name .svn | rm -fr
No funcionó ...
Casi lo tienes. Si desea pasar el resultado de un comando como parámetros a otro, necesitará usar xargs. Agregar -print0
se asegura de que el script pueda manejar rutas con espacios en blanco:
find . -type d -name .svn -print0|xargs -0 rm -rf
Como un tema importante, cuando desee utilizar el shell para eliminar las carpetas .svn, necesitará un argumento de profundidad para evitar que el comando de búsqueda ingrese al directorio que acaba de eliminarse y muestre mensajes de error como, por ejemplo,
"find: ./.svn: No such file or directory"
Como resultado, puede usar el comando find como se muestra a continuación:
cd [dir_to_delete_svn_folders]
find . -depth -name .svn -exec rm -fr {} /;
En Windows, puede usar la siguiente secuencia de comandos de registro para agregar "Eliminar carpetas SVN" a su menú contextual de clic derecho. Ejecútelo en cualquier directorio que contenga esos 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/" /""
Lo que escribiste envía una lista de nombres de archivos separados por nueva línea (y rutas) a rm
, pero rm no sabe qué hacer con esa entrada. Solo está esperando los parámetros de línea de comando.
xargs
toma datos, generalmente separados por líneas nuevas, y los coloca en la línea de comando, por lo que agregar xargs hace que tu trabajo funcione:
find . -name .svn | xargs rm -fr
xargs
es lo suficientemente inteligente como para que solo transmita tantos argumentos a rm
como pueda aceptar. Por lo tanto, si tuviera un millón de archivos, podría ejecutar rm
1,000,000 / 65,000 veces (si su shell podría 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, los siguientes también funcionan:
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
forman ambos call rm
para cada carpeta que se elimina, por lo que si tuviera 1,000,000 de carpetas, se rm
1,000,000 de veces. Esto es ciertamente menos que ideal. Las implementaciones más recientes de rm
permiten concluir el comando con un +
que indica que rm
aceptará tantos argumentos como sea posible:
find . -name .svn -exec rm -rf {} +
La última versión de find / xargs usa print0, que hace que find genere resultados que usen /0
como terminador en lugar de una nueva línea. Como los sistemas POSIX permiten cualquier caracter pero /0
en el nombre de archivo, esta es realmente la forma más segura de asegurarse de que los argumentos se pasen correctamente a rm
o a 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 de en el directorio base y una profundidad que iniciará primero la profundidad.
Prueba esto:
find . -name .svn -exec rm -rf ''{}'' /;
Antes de ejecutar un comando como ese, a menudo me gusta ejecutar esto primero:
find . -name .svn -exec ls ''{}'' /;
Si no te gusta ver un montón de
find: `./.svn'': No such file or directory
advertencias, luego use el -depth
:
find . -depth -name .svn -exec rm -fr {} /;
Sin necesidad de pipes, xargs, exec ni nada:
find . -name .svn -delete
Edición: Es broma, evidentemente, unlinkat()
llamadas unlinkat()
bajo el capó, por lo que se comporta como unlink
o rmdir
y se negará a operar en directorios que contengan archivos.
Ya hay muchas respuestas 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:
svn export <url>
find . -name .svn |xargs rm -rf