svn status | grep '\!' | awk '{print $2}' | tee list.$$ | xargs svn revert
xargs svn delete < list.$$
rm list.$$
Команда tee
подобна Т-образному трубному фитингу; одна копия вывода отправляется в каждый именованный файл, а другая - в стандартный вывод. Здесь я назвал только один файл. Это приводит к тому, что все откаты происходят до любого из удалений. Имя list.$$
- это простой способ защиты сценария от попадания в файлы других процессов; есть программы, подобные mktemp
, которые можно использовать для создания более безопасных и менее предсказуемых имен. OTOH, если вы не работаете во враждебной среде, это вряд ли имеет значение. Если вы будете очень осторожны, вы создадите trap
, чтобы файл был очищен:
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
Есть и другие уловки, которые можно попробовать, но по крайней мере некоторые из них не гарантируют последовательную работу. Например, процесс подстановки в bash
:
svn status | grep '\!' | awk '{print $2}' | tee >(xargs svn revert) | xargs svn delete
Каждый файл будет возвращен и удален, но последовательность действий непредсказуема.
person
Jonathan Leffler
schedule
22.09.2012