Не вызывайте xargs, если предыдущая команда ничего не возвращает

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

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

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

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

Ответ 1

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

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

Ответ 2

Если вы используете версию 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

Ответ 3

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

readarray -t OUTPUT < <(exec svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}')
[[ ${#OUTPUT[@]} -gt 0 ]] && svn add "${OUTPUT[@]}"

Ответ 4

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

fooobar.com/info/13809/...