2012-06-26 69 views
6

Có sự cố - cần lưu trữ bản sao lưu cơ sở dữ liệu trên FTP. Trên FTP không nên nhiều hơn 10 back-up, tức là, Sau khi bạn thêm sao lưu vào FTP nên được loại bỏ, các tập tin cũ nhất để làm cho tổng số tập tin không thể vượt quá 10 miếng. Làm cách nào để chúng tôi có thể thực hiện việc xóa khỏi ftp? Tôi đang cố gắng để viết một kịch bản, nhưng không hoạt động xóa: Tập lệnh shell Linux để xóa các tệp cũ từ 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> 

Trả lời

-3

Không sử dụng FTP (vì nhiều lý do). Tuy nhiên, nếu bạn làm điều đó trong ssh, bạn nhận được một tty, môi trường, và mọi thứ khác. Ngoài ra, nếu bạn muốn một tập tin 10 ngày tuổi để được xóa (và không phải là một ngày 10 lịch cũ) một đơn giản find -mtime +10 -delete sẽ thay thế cho vòng lặp. Vì vậy:

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

Nếu bạn muốn FTP, hãy xem NcFTP, nếu tôi nhớ chính xác có một số khả năng viết kịch bản khá ở đó.

10

Đây là tập lệnh mà tôi đã viết để xóa bất kỳ tệp nào trên một trang web ftp từ xa cũ hơn 7 ngày. Nó hoạt động bằng cách lấy danh sách thư mục, phân tích cú pháp ngày sửa đổi và sau đó kết nối lại để xóa bất kỳ tệp nào cũ hơn ngày thứ hai.

Tôi nghi ngờ rằng các số được mã hóa cứng vào vòng lặp (ngày phần tử) có thể thay đổi tùy thuộc vào thiết lập hệ thống của bạn. Định dạng trả về của lệnh ls phụ thuộc vào các thiết lập hệ thống cục bộ.

Giả sử các bản sao lưu của bạn là hàng ngày, sau đó, thiết lập các ngày từ 10 đến 10 có thể giải quyết được sự cố của bạn.

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

Rất đẹp! Nhưng tại sao bạn ngắt kết nối và kết nối lại giữa các tệp? Để kết nối mở. – dotancohen

+0

Cảm ơn kịch bản tuyệt vời :) nhưng tôi có lỗi "giá trị quá lớn đối với cơ sở (mã thông báo lỗi là" 08 ")" khi $ DD là 0x, nó được hiểu là x trong bát phân (vấn đề 8 và 9) – jsan

+0

'xóa tệp cũ hơn hơn 6 tháng 7 Cố ngày ftp 12.672.814 file: 7 ngày ftp 12.672.913 file: 1 ngày ftp 12.672.889 file: 7 ngày ftp 1099121178 file: 7 ngày ftp 1099121165 file: 1 ngày ftp 1099121206 file: 7 ngày tập tin : Xóa Đang thử 62.210.17.5 ... (tệp từ xa) Không thể xóa thoát: Không có tệp hoặc thư mục như vậy' – Ghayel

2

Cái này là đối phó với sftp và đã kiểm tra ngày đúng như kịch bản từ @Graeme chỉ làm việc trong vòng một tháng:

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

Dưới đây là một giải pháp ngắn sử dụng lftp, mà cũng sẽ làm việc với thư mục con:

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

Nó có hai nhược điểm mặc dù:

  • Trước tiên, nó sẽ tải xuống các tệp cũ đó (trước khi xóa chúng), do đó, nó sử dụng thêm một số băng thông
  • Các tệp cũ này sẽ chiếm một khoảng trống trên đĩa cục bộ trước khi bị xóa. Bạn có thể sử dụng nullfs để pally cho rằng
Các vấn đề liên quan