Baixar varios arquivos FTP sem duplica-los [RESOLVIDO]

1. Baixar varios arquivos FTP sem duplica-los [RESOLVIDO]

Vitor
vitorgn

(usa openSUSE)

Enviado em 23/02/2022 - 10:05h

Olá, com linux e preciso de uma ajuda com relação a criação de um Shell para baixar arquivos de um servidor FTP, vamos lá:
Tenho uma pasta FTP onde diariamente são criados vários arquivos com nomes diferentes exemplo 00001, 00002, 000003 mas todos com a extensão XML, esses arquivos permanecem no servidor FTP e não são deletados, eu preciso baixar esses arquivos via FTP varias vezes ao dia porem não posso trazer os mesmos arquivos todo vez somente os os últimos criados. Montei mais ou menos um Shell com o básico, mas como disse dessa forma sempre vou baixar todo o conteúdo da pasta, e não encontrei nenhuma foram de renomear vários arquivos nem move-los para uma outra pasta para que não sejam baixados novamente poderiam me ajudar com essa questão se existe alguma forma de fazer isso?

#!/bin/bash
ftp -niv 999.999.9.99 <<FIM
user usuario senha
passive off
cd arquivos
get *.XML
bye


  


2. Re: Baixar varios arquivos FTP sem duplica-los [RESOLVIDO]

Diego Mendes Rodrigues
diegomrodrigues

(usa Ubuntu)

Enviado em 23/02/2022 - 13:43h

Vitor,

Resolvi o mesmo tipo de problema utilizando um script em Python.
Neste script, comparo a lista dos arquivos que estão no FTP, com a lista dos arquivos da pasta local, para saber quais preciso baixar.

###
### Download de arquivos do servidor de FTP
### Arquivos que existem localmente não são descarregados novamente
### -
### Diego Mendes Rodrigues
###
from ftplib import FTP
from os import listdir
from os.path import isfile, join

# Informações do FTP
server = '??????'
username = '??????'
password = '??????'
remote_folder = 'arquivos_server'

# Informações da pasta local onde or arquivos estão
local_folder = 'D:\\arquivos\\'

# Exibir informações de debug
info_debug = True

# Listar os arquivos da pasta local
local_files = [f for f in listdir(local_folder) if isfile(join(local_folder, f))]
local_files.sort()

try:
ftp = FTP(server, username, password)
except:
if info_debug:
print('Falha na autenticação')
exit()

# Entrar no diretporio remoto e buscar a lista de arquivos
ftp.cwd(remote_folder)
list_files = ftp.nlst()
list_files.sort()

# Remover '.' e '..' da lista de arquivos
remote_files = list_files[2:]

# Arquivos para download
download_files = list(set(remote_files) - set(local_files))
download_files.sort()

# Informações para verificação
if info_debug:
print('Arquivos locais:')
print(local_files)
print('\nArquivos remotos:')
print(remote_files)
print('\nArquivos que o download será realizado:')
print(download_files)

# Realizar o download dos arquivos do FTP
for file_to_download in download_files:
try:
file_local_to_save = local_folder + file_to_download
with open(file_local_to_save, 'wb') as f:
ftp.retrbinary("RETR {0}".format(file_to_download), f.write)
if info_debug:
print(f'Download realizado: {file_local_to_save}')
except FileNotFoundError:
if info_debug:
print(f'Falha no download: {file_local_to_save}')


Atenciosamente,
Diego M. Rodrigues


3. Re: Baixar varios arquivos FTP sem duplica-los [RESOLVIDO]

Vitor
vitorgn

(usa openSUSE)

Enviado em 23/02/2022 - 14:01h


Muito Obrigado pela dica, vou tentar dessa forma


4. Re: Baixar varios arquivos FTP sem duplica-los [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 23/02/2022 - 17:58h


vitorgn escreveu:

Olá, com linux e preciso de uma ajuda com relação a criação de um Shell para baixar arquivos de um servidor FTP, vamos lá:
Tenho uma pasta FTP onde diariamente são criados vários arquivos com nomes diferentes exemplo 00001, 00002, 000003 mas todos com a extensão XML, esses arquivos permanecem no servidor FTP e não são deletados, eu preciso baixar esses arquivos via FTP varias vezes ao dia porem não posso trazer os mesmos arquivos todo vez somente os os últimos criados. Montei mais ou menos um Shell com o básico, mas como disse dessa forma sempre vou baixar todo o conteúdo da pasta, e não encontrei nenhuma foram de renomear vários arquivos nem move-los para uma outra pasta para que não sejam baixados novamente poderiam me ajudar com essa questão se existe alguma forma de fazer isso?

#!/bin/bash
ftp -niv 999.999.9.99 <<FIM
user usuario senha
passive off
cd arquivos
get *.XML
bye

Boa tarde Vitor, seguem sugestões:

conecte no server, via ssh, execute
ls -1 arquivos/*.XML > Lista_Server.txt
copie o arquivo gerado, para a pasta local

Execute no bash, na pasta que tem os arquivos baixados do Server
while read arq;do
[ ! -e $arq ] && echo "$arq" >> baixar_arqs.txt;
done<Lista_Server.txt

Outra Opção:
Na pasta que tem arquivos baixados do Server, execute:
ls -1 *.XML > Lista_Local.txt
Execute no bash:
diff Lista_Server.txt Lista_Local.txt|awk 'NF==2{print $2}' >> baixar_arqs.txt

+ uma opção, estando na pasta que tem arquivos baixados do Server,
Execute:
for arq in *.XML;do
grep "$arq" Lista_Server.txt && sed -i "/$arq/d;" Lista_Server.txt;
done
Após a ultima opção,
Lista_Server.txt, terá somente o que deve ser baixado.

É isso...


______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/ | sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
Att.: Marcelo Oliver
______________________________________________________________________







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts