2013-09-15 1 views
2

не возвращать меня следующая команда, которая проверяет, является ли добавлены какие-либо новые файлы и автоматически вызывает svn add всех этих файлов неНе называйте xargs, если предыдущая команда ничего

svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add 

Но когда есть нет файлы, svn add приводит к предупреждению.

Как остановить от xargs от вызова вызываемой предыдущей команды не приводит к каким-либо значениям? Решение должно работать как с GNU, так и с BSD (Mac OS X) версиями xargs.

+2

Стандарт POSIX для [ 'xargs'] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html) (здание на де Факто-реализации «xargs» до того, как был установлен стандарт) требует, чтобы команда выполнялась один раз, даже если нет имен файлов. Кажется, только версия GNU распознает ... идиотизм? ... неудовлетворительный фактор этого требования. Если ваш код должен работать на платформах с GNU 'xargs' и без него, не устанавливая GNU' xargs', вам придется много работать. –

ответ

0

В итоге я использовал это. Не очень элегантный, но работает.

svn status | grep -v "^.[ \t]*\..*" | grep "^?" && svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add 
8

Если вы используете версию GNU, используйте xargs -r:

 
--no-run-if-empty 
-r 
    If the standard input does not contain any nonblanks, do not run the command. 
    Normally, the command is run once even if there is no input. This option 
    is a GNU extension. 

http://linux.die.net/man/1/xargs

+0

Спасибо. Но, к сожалению, мне нужен этот скрипт для работы как в GNU, так и в BSD (Mac) версии. – Sudar

1

Если вы используете Баш, другой способ является просто хранить выходы в массивах. И запустите svn только в том случае, если есть выход.

readarray -t OUTPUT < <(exec svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}') 
[[ ${#OUTPUT[@]} -gt 0 ]] && svn add "${OUTPUT[@]}" 
0
ls /empty_dir/ | xargs -n10 chown root # chown executed every 10 args 
ls /empty_dir/ | xargs -L10 chown root # chown executed every 10 lines 
ls /empty_dir/ | xargs -i cp {} {}.bak # every {} is replaced with the args from one input line 
ls /empty_dir/ | xargs -I ARG cp ARG ARG.bak # like -i, with a user-specified placeholder 

https://stackoverflow.com/a/19038748/1655942

+0

Хотя последние 2 примера работают (и позволяют повторить замещение обрабатываемого элемента), они будут выполнять команду для каждого отдельного элемента в списке (из-за подразумеваемого '-L 1'), что может означать производительность при обработке больших списков. – ack