Obtendo um arquivo com wget quando o nome do arquivo pode mudar levemente

1

Eu tenho um programa que coleta dados de cinco fontes do governo e os mescla em um grande banco de dados para minha empresa. Eu uso o wget para recuperar os arquivos. No entanto, descobri que uma das fontes altera o nome toda vez que é atualizada.

Por exemplo, da última vez que recebi o arquivo, ele foi chamado de myfile150727.flatfile . Hoje, quando tentei executar meu programa, obtive o status de saída 8 no such file . Quando entrei manualmente no ftp, descobri que o arquivo agora é chamado de myfile150914.flatfile . Então, obviamente, o nome do arquivo está mudando com base na data da última atualização.

Posso modificar meu script para levar este fato em consideração e ainda baixar automaticamente o arquivo?

    
por nonremovable 17.09.2015 / 13:38

2 respostas

5

Sim, mas os detalhes dependem de como o nome do arquivo é alterado. Se é sempre a data de hoje, basta dizer ao seu script para obter isso:

filename=myfile"$(date +%y%m%d)".flatfile
wget ftp://example.com/"$file"

Ou, se não for atualizado diariamente e houver apenas um arquivo chamado myfileWHATEVER.flatfile , obtenha isso:

wget "ftp://example.com/myfile*.flatfile"

Se você puder ter muitos arquivos com nomes semelhantes, poderá fazer o download de todos eles e manter apenas os mais novos:

wget -N "ftp://example.com/myfile*.flatfile"
## Find the newest file
for file in myfile*.flatfile; do
    [[ "$file" -nt "$newest" ]] && newest="$file";
done
## Delete the rest
for file in myfile*.flatfile; do
    [[ "$file" != "$newest" ]] && rm "$file"
done

Como alternativa, você pode extrair a data do nome do arquivo:

wget -N "ftp://example.com/myfile*.flatfile"
for file in myfile*.flatfile; do
    fdate=$(basename "${file//myfile}" .flatfile)
    [[ "$fdate" -gt $(basename "${nfile//myfile}" .flatfile) ]] && nfile="$file"
done
for file in myfile*.flatfile; do
    [[ "$file" = "$nfile" ]] || rm "$file"
done

Note que o acima irá manter vários arquivos se mais de um tiver a mesma data de modificação.

    
por 17.09.2015 / 14:06
0

algo como

for site in site1.com site2.com
do
   mkdir -p $site
   ftp -in <<EOF
   connect $site
   user archemar foo
   lcd $site
   cd /path/to/remote/file
   mget myfile*.fileflat
   quit
EOF
done
  • substitua user archemar foo pelo seu nome de usuário e senha ou user ftp se for permitido o uso de ftp anônimo.
  • substitua cd /path/to/remote/file pelo óbvio
  • isso colocará o misc * .flatfile no diretório do site correspondente. Se o nome for exclusivo, remova mkdir $site e lcd $site .
  • de acordo com seu processo de atualização, convém rm antes da transferência.
por 17.09.2015 / 14:06