从FTP删除旧文件的Linux shell脚本(Linux shell script for del

2019-07-30 03:31发布

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

Answer 1:

这是一个脚本,我写的删除在远程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


Answer 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


Answer 3:

这里有一个更短的解决方案使用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来圣骑到


Answer 4:

它已经过去了好几年了,而格雷姆的回答帮我,但我遇到了一些问题,但在这里是如何解决这些问题。

有时像一句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 ,然后从beggining删除0。 像08应该成为8

如此循环上的文件之前,添加以下代码:

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

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



Answer 5:

不要使用FTP(有很多原因)。 但是,如果你这样做,在SSH,你会得到一个TTY,环境,以及其他一切。 另外,如果你想10天被删除(而不是一个10个日历日内陈旧)一个简单的文件中find -mtime +10 -delete将取代for循环。 所以:

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

如果你想FTP,看的NcFTP,如果我没有记错的有一些相当不错的脚本功能存在。



文章来源: Linux shell script for delete old files from ftp
标签: shell ftp