通过 bash-script 从 sftp 中删除除最新的 X 文件之外的所有文件
Remove all but the latest X files from sftp via bash-script
我有一个可用的 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)。
此脚本删除给定目录中除最后 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"
他的版本略有修改:
- 它 counts/removes 只有名为 backup*.tar
的文件
- 它使用 ls -l(用于基于行的列表)
- 我不得不使用 sshpass 而不是基于证书的身份验证。 sftp密码在/etc/backup/pw
里面
我有一个可用的 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)。
此脚本删除给定目录中除最后 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"
他的版本略有修改:
- 它 counts/removes 只有名为 backup*.tar 的文件
- 它使用 ls -l(用于基于行的列表)
- 我不得不使用 sshpass 而不是基于证书的身份验证。 sftp密码在/etc/backup/pw 里面