2012-06-26 153 views
6

存在一个问题 - 需要将数据库备份存储在FTP上。在FTP上不应该超过10个备份,也就是说,在添加备份到FTP之后应该删除,使得最老的文件总数不能超过10个。 我们如何才能从ftp中实现这样的删除? 我想写一个剧本,但不工作:删除: 用于从ftp删除旧文件的Linux shell脚本

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> 

回答

-3

不要使用FTP(有很多原因)。但是,如果你在ssh中这样做,你会得到一个tty,环境和其他一切。另外,如果你想要一个10天的文件被删除(而不是一个10个日历天的陈旧),简单的find -mtime +10 -delete将取代for循环。所以:

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

如果你想FTP,看的NcFTP,如果我没有记错的有一些相当不错的脚本功能存在。

10

这是我写的一个脚本,用于删除超过7天的远程ftp站点上的任何文件。它通过检索目录列表,解析修改日期,然后重新连接删除比ndays更早的文件来工作。

我怀疑硬编码到循环中的数字(元素日期)可能会根据系统的设置而改变。 ls命令的返回格式取决于本地系统设置。

假设您的备份每天都在进行,则将ndays设置为10可能会解决您的问题。

#!/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

非常好!但是,为什么要断开和重新连接文件?保持连接打开。 – dotancohen

+0

伟大的脚本感谢:)但我有一个错误“价值太大基地(错误标记为”08“)”当$ DD是0x它被解释为八进制的x(问题8和9) – jsan

+0

'删除旧的文件不是年7月6 试图 日期FTP 12672814文件:7 日期FTP 12672913文件:1个 日期FTP 12672889文件:7 日期FTP 1099121178文件:7 日期FTP 1099121165文件:1个 日期FTP 1099121206文件:7 日期文件: 删除 尝试62.210.17.5 ... (远程文件)无法删除退出:没有这样的文件或目录' – Ghayel

2

这一个是处理SFTP,并适当日期检查从@Graeme脚本一个月内唯一的工作:

#!/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

下面是使用lftp较短的解决方案,这也将工作与子目录:

#!/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 

它虽然两个缺点:

  • 它会先下载这些旧文件(之后再删除它们),因此它会使用更多带宽
  • 这些旧文件在删除之前会在本地磁盘上占用一些空间。您可以使用nullfs来达成
相关问题