2012-06-26 45 views
6

Existe un problema: es necesario almacenar la copia de seguridad de la base de datos en el FTP. En el FTP no debe haber más de 10 copias de seguridad, es decir, una vez que agregue la copia de seguridad a FTP debe eliminarse, los archivos más antiguos para hacer la cantidad total de archivos no pueden exceder las 10 piezas. ¿Cómo podemos implementar tal eliminación del ftp? Estoy tratando de escribir un guión, pero que no funciona eliminar: Script de shell de Linux para eliminar archivos antiguos de ftp

x=1 
ftp -vn $FTP_SERVER<<! 
user $FTP_LOGIN $FTP_PASSWORD 
binary 
put $DUMP_FILE_NAME 

for i in `ls -t` do 
    if [ $x -le $keep ] then 
     ((x++)) 
     continue 
    fi 
    delete $i 
done 

bye 
EOF 
</i> 

Respuesta

-3

No utilizar FTP (por muchas razones). Sin embargo, si haces eso en ssh, obtienes un tty, entorno y todo lo demás. Además, si desea que se elimine un archivo de 10 días de antigüedad (y no un plazo de 10 días naturales), un simple find -mtime +10 -delete reemplazaría ese ciclo. Por lo tanto:

ssh [email protected] 'find $DIR -mtime +10 -delete' 

Si desea FTP, un vistazo a NcFTP, si no recuerdo mal había algunas capacidades de scripting bastante decente allí.

10

Este es un script que escribí para eliminar cualquier archivo en un sitio ftp remoto de más de 7 días. Funciona al recuperar una lista del directorio, analizar la fecha de modificación y luego volver a conectarse para eliminar cualquier archivo anterior a ndays.

Sospecho que los números codificados en el bucle (fecha del elemento) pueden cambiar dependiendo de la configuración de su sistema. El formato de retorno del comando ls depende de la configuración del sistema local.

Suponiendo que sus copias de seguridad se realicen todos los días, la configuración de ndays a 10 podría resolver su problema.

#!/bin/bash 
# get a list of files and dates from ftp and remove files older than ndays 
ftpsite="ftp.yourserver.com" 
ftpuser="loginusername" 
ftppass="password" 
putdir="/public_ftp/admin/logs" 

ndays=7 


# work out our cutoff date 
MM=`date --date="$ndays days ago" +%b` 
DD=`date --date="$ndays days ago" +%d` 


echo removing files older than $MM $DD 

# get directory listing from remote source 
listing=`ftp -i -n $ftpsite <<EOMYF 
user $ftpuser $ftppass 
binary 
cd $putdir 
ls 
quit 
EOMYF 
` 
lista=($listing) 

# loop over our files 
for ((FNO=0; FNO<${#lista[@]}; FNO+=9));do 
    # month (element 5), day (element 6) and filename (element 8) 
    #echo Date ${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]}   File: ${lista[`expr $FNO+8`]} 

    # check the date stamp 
    if [ ${lista[`expr $FNO+5`]}=$MM ]; 
    then 
    if [[ ${lista[`expr $FNO+6`]} -lt $DD ]]; 
    then 
     # Remove this file 
     echo "Removing ${lista[`expr $FNO+8`]}" 
     ftp -i -n $ftpsite <<EOMYF2 
     user $ftpuser $ftppass 
     binary 
     cd $putdir 
     delete ${lista[`expr $FNO+8`]} 
     quit 
EOMYF2 


    fi 
    fi 
done 
+1

¡Muy bonito! Pero, ¿por qué te desconectas y vuelves a conectar los archivos? Deja la conexión abierta. – dotancohen

+0

Excelente script gracias :) pero tengo un error "value too great for base (el token de error es" 08 ")" cuando $ DD es 0x se interpreta como x en octal (problema para 8 y 9) – jsan

+0

'eliminación de archivos más antiguos que Jul 06 Tratando Fecha ftp 12672814 del archivo: 7 Fecha ftp 12672913 del archivo: 1 Fecha ftp 12672889 del archivo: 7 Fecha ftp 1099121178 del archivo: 7 Fecha ftp 1099121165 del archivo: 1 Fecha ftp 1099121206 del archivo: 7 Fecha del archivo : Eliminando Probando 62.210.17.5 ... (archivo remoto) No se pudo eliminar salir: No existe tal archivo o directorio' – Ghayel

2

Este uno está tratando con SFTP y ha cheque fecha corresponde como el script desde @Graeme sólo se está trabajando dentro de un mes:

#!/bin/bash 
# get a list of files and dates from ftp and remove files older than ndays 
ftpsite="sftp -b- -oIdentityFile=<KEYFILE> -oPort=<PORT> <USER>@<HOST>" 
putdir="/data" 

ndays=19 

# work out our cutoff date 
MM=`date --date="$ndays days ago" +%b` 
DD=`date --date="$ndays days ago" +%d` 
TT=`date --date="$ndays days ago" +%s` 

echo removing files older than $MM $DD 

# get directory listing from remote source 
echo " 
cd $putdir 
ls -l 
"|$ftpsite >dirlist 

# skip first three and last line, ftp command echo 
listing="`tail -n+4 dirlist|head -n-1`" 

lista=($listing) 

# loop over our files 
for ((FNO=0; FNO<${#lista[@]}; FNO+=9));do 
    # month (element 5), day (element 6) and filename (element 8) 
    # echo Date ${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]}   File: ${lista[`expr $FNO+8`]} 

    fdate="${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]} ${lista[`expr $FNO+7`]}" 
    sdate=`date --date="$fdate" +%s` 
    # check the date stamp 
    if [ $sdate -lt $TT ] 
    then 
     # Remove this file 
     echo "$MM $DD: Removing ${lista[`expr $FNO+5`]}/${lista[`expr $FNO+6`]}/${lista[`expr $FNO+8`]}" 
     $ftpsite <<EOMYF2 
     cd $putdir 
     delete ${lista[`expr $FNO+8`]} 
     quit 
EOMYF2 

    fi 
done 
0

he aquí una solución más corto usando lftp, que también va a trabajar con subdirectorios:

#!/bin/bash 
# get a list of files and dates from ftp and remove files older than ndays 
ftpsite="ftpback-xxx.ovh.net" 
ftpuser="user" 
ftppass="pass" 
#remote folder in which you want to delete files 
putdir="/" 
nullfolder="/tmp/null" 

ndays=19 

mkdir -p nullfolder 
MM=`date --date="$ndays days ago" +%b` 
DD=`date --date="$ndays days ago" +%d` 

echo removing files older than $MM $DD 
#The no-ssl is there because it's on a local network and remote doesn't support ftp 
lftp -e "set ftp:ssl-allow no; mirror $putdir $nullfolder --older-than=now-${ndays}days --Remove-source-files; exit" -u $ftpuser,$ftppass $ftpsite 

rm $nullfolder/* -Rf 

tiene dos inconvenientes: aunque

  • Primero descargará esos archivos antiguos (antes de eliminarlos más adelante), por lo que usa un poco más de ancho de banda
  • Esos archivos antiguos ocuparán un espacio en el disco local antes de ser eliminados. Puede usar nullfs para pally a eso
Cuestiones relacionadas