/ / Usare due volte xargs in una riga per correggere lo stato «!» Della sovversione - svn, shell, status, xargs

Usando xargs due volte in una riga per correggere lo stato «!» Di subversion - svn, shell, status, xargs

Trovo la soluzione migliore per il mio problema qui: Come risolvere lo stato di sovversione «!»

Ma ora, vorrei solo scrivere una piccola sceneggiatura per farlo.

Come questo:

svn status | grep "!" | awk "{print $2}" | xargs svn revert

svn status | grep "!" | awk "{print $2}" | xargs svn delete

Ma in una riga.

Perché, dopo lo svn ripristinato, "svn status | grep"! "" Non restituisce risultati. Razionale.

Penso di aver trovato una soluzione: Mettere i dati passati a xargs due volte in una riga ma sono un po 'arrugginito in inglese e la linea di comando non è la mia abilità.

risposte:

1 per risposta № 1
svn status | grep "!" | awk "{print $2}" | tee list.$$ | xargs svn revert
xargs svn delete < list.$$
rm list.$$

Il tee il comando è come un raccordo a T; una copia dell'output passa a ciascun file denominato e un altro all'output standard. Qui, ho "nominato un solo file. Questo costringe tutti i ripristini a verificarsi prima di qualsiasi eliminazione. Il nome list.$$ è un modo semplice per proteggere lo script dal calpestare i file di altri processi; ci sono programmi come mktemp che può essere utilizzato per creare nomi più sicuri, meno prevedibili. OTOH, se non stai funzionando in ambienti ostili, è improbabile che importi. Se stai davvero attento, creerai un trap per assicurarsi che il file sia ripulito:

tmp=${TMPDIR:-/tmp}/list.$$
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15

svn status | grep "!" | awk "{print $2}" | tee $tmp | xargs svn revert
xargs svn delete < $tmp

rm $tmp
trap 0

Ci sono altri trucchi che potrebbero essere provati, ma almeno alcuni di essi non garantiscono l'operazione sequenziale. Ad esempio, la sostituzione del processo in bash:

svn status | grep "!" | awk "{print $2}" | tee >(xargs svn revert) | xargs svn delete

Ogni file verrà sia ripristinato che cancellato, ma il sequenziamento non è prevedibile.


1 per risposta № 2

Entrambi i comandi in una riga. Nota la completa perdita di xargs. Non che xargs non sia meraviglioso, non è necessario qui.

x = "$ (svn status | grep"! "| awk" {print $ 2} ")"; svn ripristina "$ x" && svn elimina "$ x" || echo "no svn elimina $?"

Si noti che il svn delete non funzionerà se il svn ripristina non riesce. "No svn delete" indica che uno dei comandi svn non è riuscito.