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?