【问题标题】:Putting the data passed to xargs twice in one line将两次传递给 xargs 的数据放在一行中
【发布时间】:2010-06-11 03:22:42
【问题描述】:

tmp 文件包含:

database_1
数据库_2
数据库_3

我想为上述文件中的每一行运行类似“mysqldump DATABASE > database.sql && gzip database.sql”的命令。

我已经知道了 cat /tmp/database-list | xargs -L 1 mysqldump -u root -p

我想我想知道如何将传递给 xargs 的数据多次放入(而不仅仅是最后)

编辑:以下命令会将每个数据库转储到其自己的 .sql 文件中,然后 gzip 压缩它们。

mysql -u root -pPASSWORD -B -e 'show databases' | sed -e '$!N; s/Database\n//' | xargs -L1 -I db mysqldump -u root -pPASSWORD -r db.backup.sql db; gzip *.sql

【问题讨论】:

  • 你为什么不把命令分成两行(保留你拥有的那一行,像'gzip *.sql'这样的第二个命令)?

标签: mysql mysqldump xargs


【解决方案1】:

在您自己的示例中,您使用 && 在一行中使用两个命令 - 那为什么不这样做

cat file | xargs -L1 -I db mysqldump db > db.sql && cat file | xargs -L1 -I db gzip database.sql

如果您真的想在一行中仅使用 xargs 完成所有操作。虽然我相信

cat file | xargs -L1 -I db mysqldump db > db.sql && cat file; gzip *.sql

会更有意义。

【讨论】:

  • 太好了,-I 开关是我想知道的。谢谢!
  • 有趣,我一直在试图弄清楚为什么我不能在一个命令行中完成两次替换。我一直在使用-I {},但是当我将它切换为字母-I log(因为我正在处理日志文件)它开始工作。我希望这条评论能帮助遇到和我一样麻烦的人。
【解决方案2】:

如果您有一个多核 CPU(我们现在大多数人都有),那么 GNU Parallel http://www.gnu.org/software/parallel/ 可能会缩短运行时间:

mysql -u root -pPASSWORD -B -e 'show databases' \
| sed -e '$!N; s/Database\n//' \
| parallel -j+0 "mysqldump -u root -pPASSWORD {} | gzip > {}.backup.sql"

-j+0 将并行运行与 CPU 内核一样多的作业。

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 2017-02-28
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多