通过bash-script从sftp中删除除最新的X文件以外的所有文件

时间:2017-07-10 14:08:03

标签: linux bash sftp

我有一个工作bash脚本来创建备份并将它们作为tar存档上传到远程sftp服务器。

上传后,脚本应删除除最新的20个备份文件以外的所有文件。我不能在sftp上使用任何,管道,grep等等。另外,我没有在我的bash脚本中处理文件列表结果。

export SSHPASS=$(cat /etc/backup/pw)
SFTPCONNECTION=$(cat /etc/backup/sftp-connection)

sshpass -e sftp $SFTPCONNECTION  - << SOMEDELIMITER 
 ls -lt backup-*.tar
 quit 
SOMEDELIMITER 

this nice oneliner,但我没弄清楚如何在我的情况下使用它(sftp)。

2 个答案:

答案 0 :(得分:1)

此脚本将删除给定目录中除最后20个之外的所有tar文件。 -t标记按时间排序&amp;日期。 <<<重定向将$RESULT Feed扩展为stdin循环的while。我并不完全满意,因为它必须创建多个连接,但sftp我不相信有另一种方式。

RESULT=`echo "ls -t path/to/old_backups/" | sftp -i ~/.ssh/your_ssh_key user@server.com | grep tar`

i=0
max=20
while read -r line; do
    (( i++ ))
    if (( i > max )); then
        echo "DELETE $i...$line"
        echo "rm $line" | sftp -i ~/.ssh/your_ssh_key user@server.com
    fi
done <<< "$RESULT"

答案 1 :(得分:0)

Thanks to codelitt I went with this solution:

export SSHPASS=$(cat /etc/backup/pw)
SFTPCONNECTION="username@host"

RESULT=`echo "ls -tl backup*.tar" | sshpass -e sftp $SFTPCONNECTION |  grep -oP "backup.*\.tar" `

i=0
max=24
while read -r line; do
#  echo "$line "
  (( i++ ))
    if (( i > max )); then
        echo "DELETE $i...$line"
        echo "rm $line" |  sshpass -e sftp $SFTPCONNECTION 
    fi  
done <<< "$RESULT"

It's a slight modification of his version:

  • it counts/removes only files named backup*.tar
  • it uses ls -l (for line based listings)
  • I had to use sshpass instead of a certificate-based authentication. The sftp password is inside /etc/backup/pw