Назад | Перейти на главную страницу

Скопируйте файлы из подкаталогов в один каталог

Хорошо, у меня есть куча файлов в этом формате файловой структуры.

/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.

Это также отвечает на ваш вопрос о том, как сделать все сразу с помощью одной команды.