2009-09-10 12 views
7

Ich habe eine ziemlich komplizierte Bereitstellung für unsere Drupal-Site, die eine Kombination aus CVS und SVN ist. Wir verwenden CVS, um die neuesten Versionen von Modulen zu erhalten, und wir implementieren mit SVN. Leider, wenn CVS Updates Dateien zu entfernen, beschwert sich Subversionen, weil sie nicht in SVN entfernt wurden. Ich versuche etwas Shell-Skripting und Perl zu machen, um einen svn rm Befehl auf all diesen Dateien auszuführen, die bereits aus dem Dateisystem gelöscht wurden, aber ich bin nicht weit gekommen. Was ich bisher habe, ist dies:Pipe Shell-Ausgabe zu Svn del Befehl?

svn st | grep ! 

Dies gibt eine Liste aller Dateien aus dem Dateisystem gelöscht wie folgt:

!  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. . . 

Allerdings möchte ich irgendwie eine svn del auf jedem von diesen laufen Linien. Wie kann ich diese Ausgabe in mein Perl-Skript bekommen, oder alternativ, wie kann ich svn del auf jeder dieser Zeilen ausführen?

Edit: Der genaue Befehl, den ich verwendet, mit etwas Hilfe von allem war

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

Antwort

10

Versuchen xargs verwendet wird, wie folgt aus:

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

Der xargs Befehl nimmt Linien auf seinen Standard Eingabe, und dreht sie herum und verwendet diese Zeilen als Befehlszeilenparameter auf der svn rm. Standardmäßig verwendet xargs mehrere Zeilen mit jedem Aufruf seines Befehls, was im Fall von svm rm in Ordnung ist.

Sie müssen möglicherweise auch mit dem Befehl experimentieren, um es genau richtig zu machen. Standardmäßig verwendet eine Registerkarte als Trennzeichen, und Subversion kann dort Leerzeichen ausgeben. In diesem Fall müssen Sie möglicherweise cut -d' ' -f6 oder etwas verwenden.

Wie immer beim Erstellen einer solchen Befehlspipeline Teile gleichzeitig ausführen, um sicherzustellen, dass die Dinge richtig aussehen. Führen Sie also alles bis zum Befehl, um sicherzustellen, dass Sie die Liste der Dateinamen haben, die Sie erwarten, vor läuft es wieder mit "| xargs svn rm" am Ende.

+2

Ich würde 'grep!' In 'grep ^!' Ändern, um sicherzustellen, dass wir nicht versehentlich Dateien mit Ausrufezeichen in ihrem Pfad löschen. –

+0

Das ist eine kluge Idee. –

+0

Wunderbar, ich hatte keine Ahnung von Schnitt oder Xargs. Ich wusste, dass Perl nicht der einfachste Weg war, aber ich kenne mich ein wenig aus. – jergason

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

Wie eine Alternative zu den oben genannten haben, ich so etwas wie verwenden würde:

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

Ich finde awk die Pattern-Matching-Sprache für Aufgaben wie das sehr praktisch.