SFTP - busca recursivamente novos arquivos

0

Eu tenho uma estrutura de sistema de arquivos removida assim:

+ /measure
    + / 2013-09
         + / 2013-09-04
              + / fooinstrument
                   + result03343445845.csv
                   + result03343445846.csv
              + / barinstrument
                   + result03343445847.csv
                   + result03343445848.csv

Ele contém muitos arquivos em uma estrutura hierárquica. Eu tenho acesso somente leitura a isso via SFTP (nenhum outro protocolo, como o CIFS, disponível ou qualquer software especial em execução no servidor). (Portanto, não consigo instalar nenhum software no host de origem.)

Eu quero importar esses arquivos para o meu banco de dados toda noite usando um cron job (o cron job em si não é problema). Portanto, eu gostaria de baixar recursivamente todos os novos arquivos para o meu sistema de arquivos local e passar o caminho de cada arquivo baixado para o meu aplicativo (seu nome de arquivo como um parâmetro de linha de comando), por exemplo:

/usr/local/bin/myapp -import /srv/localstorage/result03343445845.csv

Essa invocação de myapp não é um ponto crucial. Se eu conseguir obter uma lista de todos os caminhos baixados canalizando a saída do downloader para algum arquivo, posso ler a lista de arquivos linha por linha mais tarde e invocar o aplicativo. Isso não é problema.

Eu não me importo com a hierarquia de diretórios original. Meu objetivo principal é obter os arquivos no sistema de arquivos local para que minha ferramenta de linha de comando possa ser alimentada com o nome do arquivo como uma entrada. Então, se eu tenho uma duplicata da hierarquia profunda dada pelo servidor ou se todos os arquivos vão para o mesmo diretório, isso não é importante. O último pode ser ainda mais interessante, pois os nomes dos arquivos são em série únicos. Portanto, não há problema em mover todos os arquivos para um único diretório.

+ / localstorage
     + result03343445845.csv
     + result03343445846.csv
     + result03343445847.csv
     + result03343445848.csv

Um dos meus problemas é que os arquivos de origem permanecem no servidor para sempre. Portanto, o servidor não exclui arquivos antigos que eu já baixei, pois não sou o único que coleta esses dados. Portanto, o script deve "lembrar" quais arquivos são antigos (= > não baixe!), Por exemplo, mantendo cópias locais de todos os arquivos recuperados. (Se dois arquivos tiverem o mesmo nome de arquivo, eles podem ser considerados com segurança de forma igual, já que o nome do arquivo é feito de um número de série. Portanto, nenhuma comparação de conteúdo é necessária.)

Outro ponto importante: depois de um ano, haverá provavelmente 30.000 arquivos ou até mais. Não era razoável baixar todos os arquivos todas as noites, incluindo os antigos que eu já tenho. Portanto, é realmente necessário apenas fazer o download dos novos arquivos (novo = nenhum nome de arquivo na cópia local).

Qual é a maneira mais fácil e melhor de fazer isso no Linux (Debian) ? Pensei em um script de shell que usa sftp , scp ou talvez mesmo curl ? Muito obrigado pelo seu conselho e suas ideias em tal roteiro!

// edit: By the way, o que você acha? A pergunta se encaixa melhor no Serverfault?

    
por MrSnrub 04.09.2013 / 01:20

2 respostas

2

rysnc é um ótimo utilitário para sincronizar hierarquias de diretório. O ideal é que você tenha rsync instalado no servidor e no cliente, mas funcionará mesmo se instalado apenas no cliente. Esses comandos transferirão arquivos que ainda não existem na máquina local e executarão myapp neles.

cd DESTINATION_DIR
rsync -rv --ignore-existing --log-format='%o %f' USER@HOST:/PATH_TO_measure_DIR . | grep recv | sed "s,recv ,," | xargs -i sh -c "[ -f {} ] && /usr/local/bin/myapp -import {}"

rsync traz os arquivos (preservando a estrutura de diretórios), então nós analisamos a lista de arquivos recebidos, asseguramos que eles são arquivos regulares (não queremos executar myapp em diretórios recém-criados), e então invoque myapp neles.

    
por 04.09.2013 / 03:14
1

monte o diretório do servidor localmente para você:

sshfs  username@servername:/path/ /mount

ou

curlftpfs username@servername:/path/ /mount

então

rsync -av /mount /data/ > /data/rsync.log

copia apenas novos arquivos e você tem nomes de arquivos no arquivo de log

    
por 04.09.2013 / 02:34