gnu 并行 mysql 加载数据本地 INFILE

gnu parallel mysql LOAD DATA LOCAL INFILE

我正在尝试使用 GNU parallel 执行多个 LOAD DATA LOCAL INFILE mysql 命令,其中:

看来我调用 GNU parallel 的方式是正确的,除了它 在 mysql 命令后不保留双引号 -e,导致无法正常工作。

例如

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 之后加回双引号吗?

回答我自己的问题,解决方案是转义所有双引号、单引号和括号符号:

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\'\"

懒惰而有效的方法:将mysql命令放在一个函数中,然后让parallel调用它,传递{1}{2}

并行手册页实际上建议使用函数:
https://www.gnu.org/software/parallel/man.html#QUOTING