Excluindo arquivos do servidor FTP remoto com mais de x dias

3

Eu tenho um servidor FTP remoto onde eu armazeno alguns backups via cronjob.

O problema é que eu só tenho uma pequena quantidade de espaço para fazer backups incrementais. Eu quero manter os backups por aproximadamente 14 dias.

Eu não tenho nenhum outro acesso ao servidor, exceto o FTP, e agora não sei como excluir arquivos com mais de x dias. Cada arquivo tem um nome com uma data nele

yxzNamezxy-date-y-m-d.tar.bz2 (datev-20100111.tar.bz2(

Espero conseguir ajuda aqui.

Felicidades e agradecimentos pelas respostas esperançosas,

Dennis

/ Editar

Estou tentando usar a coisa de onda que é manipulada em uma resposta com essa parte do código

curl ftp://$FTP_SERVER --user $FTP_USER:$FTP_PASS --list-only > files.tmp
declare -a aFiles
let iCount=0
exec < files.tmp
while read sLine
do
        aFiles[$iCount]=$sLine
        ((iCount++))
done

echo -e "\n Files: \n\n\n"
echo ${aFiles[@]}

echo -e "\nfor ...\n\n\n"
for sFile in $aFiles
do
        echo -e "\nFile:" $sFile
done

mas o loop secound não me fornece mais de 1 nome de arquivo

Felicidades,

Dennis

    
por user25634 12.01.2010 / 15:33

4 respostas

3

Você pode enviar uma série de comandos para lftp e agrupá-los em um script de shell que calcula o nome dos arquivos antigos demais (veja o script abaixo).

TODAY=$(date --iso)                   # Today's date like YYYY-MM-DD
RMDATE=$(date --iso -d '6 days ago')  # TODAY minus X days - too old files
FTPUSER=username
FTPPW=password                        # Better load this from an encrypted file
FTPSERVER=FQDN_or_IP
LFTP=/usr/bin/lftp                    # Path to binary
TMPDIR=$(mktemp -d)                   # Your archives are here

# CAUTION: mput -E deletes local files after upload
echo -n "Uploading files via FTP... "
$LFTP << EOF
open ${FTPUSER}:${FTPPW}@${FTPSERVER}
cd backups/${HOSTNAME}
mkdir ${TODAY}
cd ${TODAY}
mput -E ${TMPDIR}/*
cd ..
rm -rf ${RMDATE}
bye
EOF
echo "Done."

Certifique-se de que ninguém execute root pode ler este script ou colocar as credenciais em outro lugar. TMPDIR é o diretório onde os backups residem localmente. Claro que você precisa editar as partes óbvias.

HTH,
PEra

    
por 12.01.2010 / 20:10
1

Com o alto risco de ser rejeitado por postar um comentário tardio sobre este tópico, aqui vai uma ideia.

Se você não se preocupa em ter datas em seus nomes de arquivos, e se você mantiver um pequeno número gerenciável de backups, você pode usar nomes de arquivos ordinais: ou seja, backup.1.tgz, backup.2.tgz, backup.3. tgz e assim por diante.

Com esses nomes, você pode simplesmente renomear os backups anteriores antes que um novo seja carregado.

  • renomeie backup.2.tgz backup.3.tgz
  • renomeie backup.1.tgz backup.2.tgz
  • colocar backup.1.tgz
por 17.08.2016 / 22:18
0

Você deve poder escrever um script para:

  • Obtenha a lista de arquivos usando a opção --list-only de curl
  • Analise a lista dos arquivos que você deseja excluir
  • Use a opção --quote ou --request para enviar um comando rm ou DELE com os nomes de arquivos selecionados

Editar:

Seu segundo loop está se referindo a $aFiles como um escalar. Você precisa referenciá-lo como um array como este:

for sFile in ${aFiles[@]}
do
        echo -e "\nFile:" $sFile
done

Além disso, você não precisa de um arquivo temporário. Você deve conseguir canalizar curl para o while .

    
por 12.01.2010 / 16:38
0

Eu tenho uma situação semelhante e vejo que isso ainda não foi totalmente respondido. Eu entendo que essas 3 balas são os marcos do script:

  • Obtenha a lista de arquivos usando a opção --list-only de curl
  • Analise a lista dos arquivos que você deseja excluir
  • Use a opção --quote ou --request para enviar um comando rm ou DELE com os nomes de arquivos selecionados

e isso é óbvio. Mas podemos obter um script que esteja fazendo isso?

Meus arquivos têm nomes de arquivos contendo a data e a hora em que foram gerados e enviados para o servidor FTP remoto:

xxx.yyy.z.aaa_01_20160313102903_DUMP01.dmp

A posição da data e hora (por exemplo, 20160313102903) no nome do arquivo é estática. É claro que os carimbos de hora desses arquivos também são válidos.

Meu objetivo é excluir arquivos com mais de X dias usando um script que deve ser executado no cron em uma máquina linux onde posso usar somente curl ou lftp.

  • Não consigo usar nenhum outro protocolo, exceto ftp para acessar o servidor FTP (sem sftp, sem ssh)

  • Eu não posso usar o comando date com a palavra "X days ago" nem a sintaxe "--iso" como essa máquina linux está rodando BusyBox v1.20.2 (2015-01-30 16:18:45 WET) que não entende referências de datas humanas

  • Não consigo criar subpastas temporárias nesse servidor FTP

Tenho pesquisado scripts que devem me levar à solução, mas como sou linux noob, estou progredindo muito lentamente e até agora só encontrei:

  • Posso listar a data de X dias atrás: date -d "@ $ (($ (date +% s) - 86400 * $ XDays))"
  • Consigo listar todos os arquivos do servidor FTP: curl ftp: // [FTP_IP] / pasta / subpasta / * --user MyUser @ [FTP_IP]: [MyUserPassword] - somente lista "

O roteiro real é muito bem-vindo.

    
por 13.03.2016 / 11:49

Tags