9

有一个问题 - 需要将数据库备份存储在 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>
4

5 回答 5

13

这是我为删除远程 ftp 站点上超过 7 天的所有文件而编写的脚本。它的工作原理是检索目录列表,解析修改日期,然后重新连接以删除任何早于 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
于 2012-09-23T13:38:13.760 回答
5

这个是处理 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
于 2015-02-20T08:52:51.133 回答
1

它已经过去了几年,虽然格雷姆的回答对我有所帮助,但我遇到了一些问题,这里是如何解决它们。

有时like这个句子在变量Trying aaaa:bbb:ccc:dddd::0...的第一行listing。你必须删除它。

rem="Trying aaaa:bbb:ccc:dddd::0...";
rep="";
listing=${listing/$rem/$rep}

jsan 还评论说他面临其他问题:“对于 base 的值太大(错误标记为“08”)”当 $DD 为 0x 时,它被解释为八进制中的 x(8 和 9 的问题)

我遇到了同样的问题。因此,您最好确保 or 中没有非数字字符,$MM然后$DD从开头删除 0。喜欢08应该变成8.

所以在循环文件之前,添加以下代码:

MM=$(tr -dc '0-9' <<< $MM)
DD=$(tr -dc '0-9' <<< $DD)
MM=${MM#0}
DD=${DD#0}

前两行删除非数字字符,倒数第二行解决了问题08

于 2018-06-10T05:48:01.533 回答
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来解决这个问题
于 2016-12-27T07:50:01.580 回答
-5

不要使用 FTP(有很多原因)。但是,如果您在 ssh 中执行此操作,您将获得 tty、环境和其他所有内容。此外,如果您希望删除一个 10 天前的文件(而不是一个 10 个日历天过时的文件),那么一个简单的文件find -mtime +10 -delete将替换该 for 循环。所以:

ssh user@host 'find $DIR -mtime +10 -delete'

如果您想要 FTP,请查看 NcFTP,如果我没记错的话,那里有一些相当不错的脚本功能。

于 2012-06-26T09:25:09.477 回答