Хорошо, у меня есть куча файлов в этом формате файловой структуры.
/backup/daily/database1/database1-2011-01-01.sql
/backup/daily/database1/database1-2011-01-02.sql
/backup/daily/database1/database1-2011-01-03.sql
/backup/daily/database1/database1-2011-01-04.sql
/backup/daily/database1/database1-2011-01-05.sql
/backup/daily/database1/database1-2011-01-06.sql
/backup/daily/database1/database1-2011-01-07.sql
/backup/daily/anotherdb/anotherdb-2011-01-01.sql
/backup/daily/anotherdb/anotherdb-2011-01-02.sql
/backup/daily/anotherdb/anotherdb-2011-01-03.sql
/backup/daily/anotherdb/anotherdb-2011-01-04.sql
/backup/daily/anotherdb/anotherdb-2011-01-05.sql
/backup/daily/anotherdb/anotherdb-2011-01-06.sql
/backup/daily/anotherdb/anotherdb-2011-01-07.sql
/backup/daily/stuff/stuff-2011-01-01.sql
/backup/daily/stuff/stuff-2011-01-02.sql
/backup/daily/stuff/stuff-2011-01-03.sql
/backup/daily/stuff/stuff-2011-01-04.sql
/backup/daily/stuff/stuff-2011-01-05.sql
/backup/daily/stuff/stuff-2011-01-06.sql
/backup/daily/stuff/stuff-2011-01-07.sql
И многое другое.
в конечном итоге я хочу импортировать все файлы 2011-01-07.sql в мою базу данных mysql.
Это работает для одного
mysql -u root -ppassword < /backup/daily/database1/database1-2011-01-07.sql
Это прекрасно восстановит эту базу данных из этого файла резервной копии.
Я хочу запустить процесс для всех баз данных.
Итак, я планирую сначала скопировать все файлы sql 2011-01-07 в каталог tmp, например.
cp /backup/daily/*/*2011-01-07*.sql /tmp/all
К сожалению, приведенная выше команда не работает, я получаю сообщение об ошибке:
cp: cannot stat ..... Нет такого файла или каталога
Так вы, ребята, можете мне помочь с этим. Для получения бонусных баллов, если вы можете сказать мне, как сделать следующий шаг, который импортирует все базы данных одной командой, выполняя по одной, это тоже было бы здорово.
Я действительно хочу сделать это в два отдельных шага, потому что мне нужно вручную удалить несколько файлов sql из каталога tmp, прежде чем я буду запускать команду восстановления.
Итак, мне нужно:
1) команда для копирования всех файлов sql 2011-01-07 в каталог tmp
2) команда для импорта всех этих файлов в этом каталоге в mysql
Я знаю, что это можно сделать за один шаг, но по многим причинам я бы предпочел сделать это за два шага.
Использовать find
найти их, а затем сделать все сразу.
find /backup/daily -name '*-2011-01-07.sql' -exec cat {} + | mysql -u root -p
Я сделал нечто подобное. На работе я сделал bash-скрипт, который выполняет цикл for - для каждого подкаталога, cd в него, cp все файлы в единственный целевой каталог, а затем cd резервное копирование.
Если бы у вас было несколько уровней для этого, вы могли бы стать еще интереснее и каждый раз, когда вы находите подкаталог, переходите в него и увеличивайте счетчик. По завершении сделайте резервную копию компакт-диска и уменьшите счетчик.
Вы также можете сделать что-нибудь с помощью find ./ -type -f, а затем выполнить cp каждого файла в целевой каталог, при этом (возможно, используя sed) удалить все имена подкаталогов из аргумента назначения.
Чтобы скопировать все файлы sql 2011-01-07 во временный каталог (/ tmp / all согласно вопросу)
find /backup/daily -name '*-2011-01-07.sql' -exec cp -t /tmp/all {} +
импортировать
#!/bin/bash
for FILE in $( ls /tmp/all/*-2011-01-07.sql )
do
echo "Importing $FILE ... "
mysql -u root -ppassword < "$FILE" && echo "OK"
done
Вот отличный способ сделать это: используйте find (1) и gnu параллельно:
find /backup/daily -type f -name \*2011-01-07\.*.sql -print0 | parallel -0 -j1 'mysql -u root -ppassword < {}'
Команда find находит все файлы (тип f) в /backup/daily
соответствие этой строке имени. Затем вы передаете его в parallel, который передает каждое имя файла в инструмент командной строки mysql. В -print0
/ -0
combo гарантирует, что никакие странные имена файлов или имена файлов с пробелами не вызовут проблем, завершаясь нулями вместо пробелов. Однако некоторые версии find не поддерживают это. В -j1
сообщает parallel выполнять одно задание за раз, вы можете увеличить это значение, если безопасно загружать сразу несколько файлов в mysql.
Это также отвечает на ваш вопрос о том, как сделать все сразу с помощью одной команды.