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



我有一个有效的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 

有这个不错的单行,但我没有弄清楚如何在我的情况下使用它(sftp(。

此脚本删除给定目录中除最后 20 个文件之外的所有 tar 文件。-t标志按时间和日期排序。<<<重定向$RESULT将其扩展到while循环的stdin。我对它并不完全满意,因为它必须创建多个连接,但有了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"

多亏了codelitt,我选择了这个解决方案:

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"

这是对他的版本的轻微修改:

  • 它仅计算/删除名为 backup* 的文件.tar
  • 它使用 ls -l(用于基于行的列表(
  • 我不得不使用 sshpass 而不是基于证书的身份验证。sftp 密码在/etc/backup/pw 里面

最新更新