2012-06-26 193 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來達成
相關問題