【问题标题】:Remove all but the latest X files from sftp via bash-script通过 bash-script 从 sftp 中删除除最新的 X 文件之外的所有文件
【发布时间】:2017-12-14 07:37:27
【问题描述】:

我有一个可用的 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)。

【问题讨论】:

    标签: linux bash sftp


    【解决方案1】:

    此脚本删除给定目录中的所有 tar 文件,最后 20 个文件除外。 -t 标志按时间和日期排序。 &lt;&lt;&lt; 重定向将 $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"
    

    【讨论】:

      【解决方案2】:

      感谢 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 里面

      【讨论】:

        猜你喜欢
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 2015-01-02
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多