Una de las misiones de una herramienta de exportación que tengo en mi aplicación es limpiar todos los .svn
directorios 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 .svn
archivos.
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 tmp
resultados ...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.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 lo que haya funcionadoxargs
es lo suficientemente inteligente como para pasarle tantos argumentosrm
como pueda aceptar. Por lo tanto, si tuviera un millón de archivos, podría ejecutarserm
1,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
-exec
formularios requierenrm
que se elimine cada carpeta, por lo que si tuviera 1,000,000 de carpetas,rm
se invocaría 1,000,000 de veces. Esto es ciertamente menos que ideal. Las implementaciones más recientes de lerm
permiten concluir el comando con una+
indicación querm
aceptará 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
\0
como un terminador en lugar de una nueva línea. Dado que los sistemas POSIX permiten cualquier carácter excepto\0
en el nombre del archivo, esta es realmente la forma más segura de asegurarse de que los argumentos se pasen correctamente arm
la aplicación o se ejecute.Además, hay una
-execdir
que se ejecutarárm
desde el directorio en el que se encontró el archivo, en lugar de hacerlo en el directorio base y una-depth
que comenzará primero en profundidad.fuente
No hay necesidad de tuberías, xargs, exec ni nada:
Editar: es broma, evidentemente
-delete
llamaunlinkat()
bajo el capó, por lo que se comporta comounlink
ormdir
y se negará a operar en directorios que contengan archivos.fuente
-delete
no tocará un directorio si contiene archivos.-force
indicador recursivo para el-delete
predicado, 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,-exec
con 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
-depth
interruptor: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
-print0
asegura 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