вторник, 28 июня 2022 г.

xargs vs mysql

Так, для себя


передача нескольких параметров через xargs

cat users_maildir_size | xargs -n 2 sh -c 'echo "$0" `expr \( "$1" + 50000 \) / 1000`' > user_quota

где users_maildir_size представляют из себя набор строк из двух слов, разделенных пробелом - имени пользователя и размером его почтовой директории 

затем  мы передаем через xargs два параметра, рассчитываем (там косяк был в том, что не проставили квоты нескольким пользователям, поэтому пришлось ограничивать, исходя из текущей загрузки)  и выводим в файл

все работает, параметры передаются.

к сожалению, никакие игры со всеми видами кавычек, экранирования и пр. для передачи параметров в mysql к результатам не привели :(

cat user_quota | xargs -I {} -n 2 sh -c 'mysql -h server database -ppass -Be "select quota from mailbox where addr like '{$1}@mail%';"'

подобная конструкция НЕ РАБОТАЕТ!!!!

пришлось сформировать файл, содержащий все команды для mysql (для каждого пользователя) 

cat mysql_commandы | xargs -I {} sh -c 'mysql -h server database -ppass -e "{}"'

и при этом все равно экранировать в файле апострофы обратными слешами

select addr,quota from mailbox where addr like \'ivanova@mail%\' and quota=0;

забавно, что без экранирования при выполнении xargs -t апострофы показываются в передаче в mysql, но, видимо, теряются по дороге, потому как сама команда при этом не выполняется :)

а вот такая конструкция (пусть и с одной переменной) работает

cat mail_addr2del | xargs -I {} mysql -h server database -ppass -e 'update mailbox set state=-1 where addr like "{}" ; '