Bem, eu fiz algum tipo de implementação mista, baseada nas respostas de Stephane e slm. Eu não poderia usar zsh porque é um servidor de produção e instalar um novo shell não é uma opção, então eu usei o lftp que foi instalado:
Explicação : No primeiro here_docs ( FTPLISTGET
), conecte-se ao servidor ftp e liste os arquivos ( nlist
). Se a listagem foi bem-sucedida ( if [ $? -eq 0 ]
), um arquivo por renomeação com a data atual no formato ano, mês, dia, hora, minuto, nanossegundo. Alguns ftps estão em alta velocidade, e salvar o segundo pode sobrescrever os arquivos.
exec_ftp(){
# LIST
LIST_FTP='lftp $protocol://$url << FTPLISTGET
user $user $pass
nlist
bye
FTPLISTGET'
# Check if list is not empty, proceed...
if [ $? -eq 0 ]; then
echo "$LIST_FTP" | while read file
do
DEST="N_$(date +%Y%m%d%H%M%N).TXT"
lftp $protocol://$url <<-DOWNLOAD
user $user $pass
cd $remotedir
get $file -o /home/user/$DEST
rm $file
bye
DOWNLOAD
echo "Done in $(date +%d/%m/%Y-%T)" >> /var/log/transfer_ftp.log
done
# If listing is not possible,
else
echo "FTP: $url user: $user - Cant reach host, or wrong credentials" >> /var/log/transfer_ftp_error.log
fi
}
Editar 1 : Alterou os backticks para $(...)
, como sugerido por slm, e adicionou a variável $protocol
. Por quê? Porque lftp pode baixar e automatizar sftp e ftps, e isso será muito bom para nós:)