views:

216

answers:

2

tmp-file contains:

database_1
database_2
database_3

I want to run a command like "mysqldump DATABASE > database.sql && gzip database.sql" for each line in the above file.

I've got as far as cat /tmp/database-list | xargs -L 1 mysqldump -u root -p

I guess I want to know how to put the data passed to xargs in more than once (and not just on the end)

EDIT: the following command will dump each database into its own .sql file, then gzip them.

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
+2  A: 

In your own example you use && to use two commands on one line - so why not do

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

if you really want to do it all in one line using xargs only. Though I believe that

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

would make more sense.

Gerald Senarclens de Grancy
Excellent, the -I switch was what I wanted to know. Thanks!
Tom R
A: 

If you have a multicore CPU (most of us have these days) then GNU Parallel http://www.gnu.org/software/parallel/ may improve the time to run:

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 will run as many jobs in parallel as you have CPU cores.

Ole Tange