Copie arquivos de subdiretórios em um diretório

2

Ok, eu tenho vários arquivos nesse formato de estrutura de arquivos.

/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

E há muito mais lotes.

ultimamente eu quero importar todos os arquivos 2011-01-07.sql para o meu banco de dados mysql.

Isso funciona para um

mysql -u root -ppassword < /backup/daily/database1/database1-2011-01-07.sql

Isso restaurará o banco de dados desse arquivo de backup.

Eu quero executar um processo no qual ele faz isso para todos os bancos de dados.

Então, meu plano é primeiro copiar todos os arquivos sql 2011-01-07 em um diretório tmp, por exemplo

cp /backup/daily/*/*2011-01-07*.sql /tmp/all

O comando acima infelizmente não está funcionando. Recebo um erro:

cp: cannot stat ..... No such file or directory

Então vocês podem me ajudar com isso? Para pontos de bônus, você pode me dizer como fazer a próxima etapa, que importa todos os bancos de dados em um comando, fazendo um de cada vez, o que também seria ótimo.

Eu realmente quero fazer isso em duas etapas separadas, porque eu preciso excluir alguns arquivos sql manualmente do diretório tmp antes de executar o comando restore.

Então eu preciso:

1) comando para copiar todos os arquivos sql 2011-01-07 para um diretório tmp

2) comando para importar todos os arquivos desse diretório para o mysql

Eu sei que é possível fazer isso em um, mas por várias razões eu realmente prefiro fazer isso em duas etapas.

    
por Derek Organ 16.01.2011 / 23:13

4 respostas

1

Para copiar todos os arquivos sql 2011-01-07 para um diretório temporário (/ tmp / all conforme pergunta)

find /backup/daily -name '*-2011-01-07.sql' -exec cp -t /tmp/all {} +

para importar

#!/bin/bash
for FILE in $( ls /tmp/all/*-2011-01-07.sql )
do
    echo "Importing $FILE ... "
    mysql -u root -ppassword < "$FILE" && echo "OK"
done
    
por 17.01.2011 / 14:35
4

Use find para encontrá-los e, em seguida, faça tudo de uma vez.

find /backup/daily -name '*-2011-01-07.sql' -exec cat {} + | mysql -u root -p
    
por 16.01.2011 / 23:23
1

Eu fiz algo parecido. No trabalho, eu fiz um script bash que faz um loop for - para cada subdiretório, cd nele, cp todos os arquivos para o único diretório de destino e, em seguida, cd de volta.

Se você tivesse vários níveis para isso, você poderia ficar ainda mais chique e toda vez que encontrar um subdiretório, faça um cd e incremente um contador. Quando concluído, faça um backup de cd e diminua o contador.

Você também pode fazer algo com find ./ -tipo -f e depois fazer um cp de cada arquivo no diretório de destino enquanto (provavelmente usando sed) tira todos os nomes de subdiretórios do argumento de destino.

    
por 16.01.2011 / 23:23
1

Aqui está uma maneira legal de fazer isso: use find (1) e gnu paralelo :

find /backup/daily -type f -name \*2011-01-07\.*.sql -print0 | parallel -0 -j1 'mysql -u root -ppassword < {}'

O comando find localiza todos os arquivos (tipo f) em /backup/daily correspondente a essa cadeia de nomes. Então você canaliza para paralelo, o que alimenta cada nome de arquivo para a ferramenta de linha de comando mysql. A combinação -print0 / -0 garante que nenhum nome de arquivo ou nome de arquivo estranho com espaços cause problemas, terminando com nulos em vez de espaços. Algumas versões do find não suportam isso, no entanto. O -j1 informa a paralela para executar um job de cada vez, você pode aumentá-lo se for seguro carregar múltiplos arquivos no mysql de uma só vez.

Isso também responde à sua pergunta sobre como você faz tudo de uma vez com um único comando.

    
por 17.01.2011 / 00:37