2009-09-10 14 views
7

Tengo una configuración de implementación bastante complicada para nuestro sitio Drupal que es una combinación de CVS y SVN. Usamos CVS para obtener las versiones más nuevas de módulos, y lo implementamos con SVN. Desafortunadamente, cuando las actualizaciones de CVS eliminan archivos, las subversiones se quejan porque no se eliminaron en SVN. Estoy tratando de hacer algunas secuencias de comandos de shell y Perl para ejecutar un comando svn rm en todos estos archivos que ya han sido eliminados del sistema de archivos, pero no he llegado muy lejos. Lo que tengo hasta ahora es la siguiente:Salida de shell de tubería a svn del command?

svn st | grep ! 

Esto genera una lista de todos los archivos borrados del sistema de ficheros, así:

!  panels_views/panels_views.info 
!  panels_views/panels_views.admin.inc 
!  contexts/term.inc 
!  contexts/vocabulary.inc 
!  contexts/terms.inc 
!  contexts/node_edit_form.inc 
!  contexts/user.inc 
!  contexts/node_add_form.inc 
!  contexts/node.inc 
etc. . . 

Sin embargo, quiero correr alguna manera un svn del en cada uno de estos líneas. ¿Cómo puedo obtener esta salida en mi script de Perl o, alternativamente, cómo puedo ejecutar svn del en cada una de estas líneas?

Editar: El comando exacto que usé, con la ayuda de todo, era

svn st | grep ^! | cut -c 9- | xargs svn del 

Respuesta

10

Intente utilizar xargs, así:

svn st | grep ^! | cut -f2 | xargs svn rm 

El comando xargs toma líneas en su norma entrada, y les da la vuelta y utiliza esas líneas como parámetros de línea de comandos en el svn rm. De forma predeterminada, xargs utiliza varias líneas con cada invocación de su comando, que en el caso de svm rm está bien.

También puede tener que experimentar con el comando cut para hacerlo bien. De manera predeterminada, cut usa una pestaña como delimitador y Subversion puede generar espacios allí. En ese caso, puede que tenga que usar cut -d' ' -f6 o algo así.

Como siempre al construir una línea de comandos de este tipo, ejecute porciones a la vez para asegurarse de que las cosas se vean bien. Por lo tanto, ejecute todo hasta el comando cut para asegurarse de tener la lista de nombres de archivos que espera, antes de ejecutándola nuevamente con "| xargs svn rm" al final.

+2

Cambiaría 'grep!' Por 'grep ^!' Para garantizar que no matamos accidentalmente los archivos que tengan puntos de exclamación en su camino. –

+0

Esa es una buena idea. –

+0

Maravilloso, no tenía ni idea de cortar o xargs. Sabía que Perl no era la forma más sencilla, pero estoy un poco familiarizado con ella. – jergason

1
svn st | egrep ^! | cut -b 9- | xargs svn del 
0

Así como una alternativa a los de arriba, usaría algo como:

svn st | awk '$1=="!"{print $2}' | xargs svn del 

que encontrar un lenguaje de patrones de awk muy útil para este tipo de tareas.

Cuestiones relacionadas