用于从ftp删除旧文件的Linux shell脚本

use*_*144 8 ftp shell

有一个问题 - 需要在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>
Run Code Online (Sandbox Code Playgroud)

小智 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
Run Code Online (Sandbox Code Playgroud)


Axe*_*hor 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
Run Code Online (Sandbox Code Playgroud)


小智 -5

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

ssh user@host 'find $DIR -mtime +10 -delete'
Run Code Online (Sandbox Code Playgroud)

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