У меня есть следующая команда, которая проверяет, добавлены ли новые файлы и автоматически вызывает 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/...