我有许多 sql 文件要导入。对于单个文件,我使用以下命令:
mysql -u root -p dbname < db.sql
是否可以使用 xargs 批量导入所有文件?就像是:
ls *.sql | xargs ....
我知道 mysqlimport 是解决方案,但我想知道 xargs 是否可以。
答案1
xargs
适合将输入转换为命令行参数。但由于mysql
不接受 SQL 脚本文件名参数,xargs
在这种情况下不太方便。
这是一个有用的用途cat
:
cat *.sql | mysql -u root -p dbname
不管怎样,你尝试以这种方式使用ls
会导致著名的为什么不应该解析 ls(1) 的输出文章。
答案2
如果您的 sql 文件彼此独立,并行导入它们可能会更快:
parallel -j10 sql mysql://root:passwd@/dbname '<' {} ::: *.sql
观看 GNU Parallel 的介绍视频以了解更多信息:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
答案3
此命令将加载当前文件夹中的所有 sql 文件,并行执行 8 个操作,如果加载成功则删除每个文件:
find . -type f -name "*.sql" -print0 | xargs -0 -n1 -P8 sh -c 'cat $0 | mysql -A -u<redacted> -p<redacted> -h<redacted> dbname && rm $0'
(我并不认为这是加载sql文件的最佳方式,但它确实满足了用于xargs
批量导入文件的问题)