存在问题 - 需要在FTP上存储数据库备份。在FTP上应该不要超过10个备份,即,在添加备份到FTP之后应该删除,最旧的文件使文件总数不能超过10个。 我们如何从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>
答案 0 :(得分:12)
这是我写的一个脚本,用于删除超过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 :(得分:3)
这个是处理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
答案 2 :(得分:1)
这是一个使用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
它有两个缺点:
答案 3 :(得分:0)
已经过了好几年了,虽然Graeme's answer对我很有帮助,但我遇到了一些问题,以及如何修复它们。
有时像Trying aaaa:bbb:ccc:dddd::0...
这样的句子位于listing
varable的第一行。你必须删除它。
rem="Trying aaaa:bbb:ccc:dddd::0...";
rep="";
listing=${listing/$rem/$rep}
此外,jsan评论说他面临其他问题:“对于基数来说价值太大(错误令牌是”08“)”当$ DD为0x时,它被解释为八进制中的x(8和9的问题)
我遇到了同样的问题。因此,您最好确保$MM
或$DD
中没有非数字字符,然后从开始删除0。与08
一样,应该成为8
。
所以在循环文件之前,添加以下代码:
MM=$(tr -dc '0-9' <<< $MM)
DD=$(tr -dc '0-9' <<< $DD)
MM=${MM#0}
DD=${DD#0}
前两行删除非数字字符,后两行用08
答案 4 :(得分:-4)
不要使用FTP(出于多种原因)。但是,如果你在ssh中这样做,你会得到一个tty,环境和其他一切。此外,如果您希望删除10天之前的文件(而不是过去10个日历日),则简单的find -mtime +10 -delete
将替换for循环。所以:
ssh user@host 'find $DIR -mtime +10 -delete'
如果您想要FTP,请查看NcFTP,如果我没记错的话,那里有一些相当不错的脚本功能。