我正在尝试使用GNU parallel执行几个LOAD DATA LOCAL INFILE mysql命令,其中:
{1}
是我从UNIX查找命令管道{2}
是chop.pl
脚本根据某些规则从文件字符串中打印出某个令牌的结果似乎我以正确的方式调用GNU并行,除了它
之后不会在mysql命令周围保留双引号
-e
,它导致它不起作用。
E.g。
find /my/folder/ -name "*.txt" | while read i; do chop.pl $i; echo $i; done | parallel -t -N 2 mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e "LOAD DATA LOCAL INFILE '{2}' IGNORE INTO TABLE tblname IGNORE 1 LINES (col1,col2,col3,col4) set col5='{1}', col6='foo'"
它正在尝试的命令,在-e
之后缺少双引号,就像这样:
mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e LOAD DATA LOCAL INFILE '/my/file/name/yadda_yadda-12345678.txt' IGNORE INTO TABLE tblname IGNORE 1 LINES (col1,col2,col3,col4) set col5='yadda_yadda', col6='foo'
如何在-e
之后添加双引号的任何想法?
答案 0 :(得分:1)
懒惰有效的方法:将mysql命令放入函数中,然后parallel
调用它,传递{1}
和{2}
。
并行手册页实际上建议使用函数:
https://www.gnu.org/software/parallel/man.html#QUOTING
答案 1 :(得分:0)
回答我自己的问题,解决办法是逃避所有双引号,单引号和括号标记:
find /my/folder/ -name "*.txt" | while read i; do chop.pl $i; echo $i; done | parallel -t -N 2 mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e \"LOAD DATA LOCAL INFILE \'{2}\' IGNORE INTO TABLE tblname IGNORE 1 LINES \(col1,col2,col3,col4\) set col5=\'{1}\', col6=\'foo\'\"