请求修改SFTP文件传输脚本以仅传输最新文件
请求修改SFTP文件传输脚本以仅传输最新文件
嘿,我来帮你搞定这个需求!你现在的脚本是固定下载指定的Database.bak文件,但要改成只传输SFTP服务器上最新的那个备份文件(包括像Copy of Database.bak、Copy (1) of Database.bak这类副本),我们可以通过先筛选出最新文件,再执行下载和删除的逻辑来实现,下面是具体的修改方案:
修改后的脚本
# 从SFTP服务器获取所有相关备份文件的时间排序列表 FILE_INFO=$(sshpass -p password123 ssh User@sft.domain.co.uk "ls -lt /Complete2/*Database*.bak") # 提取最新文件的完整路径(处理带空格的文件名) LATEST_FILE=$(echo "$FILE_INFO" | head -n 1 | awk '{for(i=9;i<=NF;i++) printf "%s ",$i; print ""}' | xargs) # 检查是否找到有效文件,再执行传输和删除 if [ -n "$LATEST_FILE" ]; then # 获取本地保存的文件名(和远程保持一致) LOCAL_FILENAME=$(basename "$LATEST_FILE") sshpass -p password123 sftp User@sft.domain.co.uk << EOF get "$LATEST_FILE" /home/user/.docker/appdata/mssql/backup/"$LOCAL_FILENAME" rm "$LATEST_FILE" EOF echo "已成功下载并删除最新备份文件:$LATEST_FILE" else echo "在SFTP目录/Complete2下未找到任何匹配的Database备份文件!" fi
脚本工作原理说明
- 第一步用
ssh直接连接服务器执行ls -lt命令:这个命令会按修改时间从新到旧列出所有匹配*Database*.bak的文件(覆盖你提到的所有备份文件名格式),这样第一行就是最新的文件。 - 第二步用
awk提取文件名:因为ls -lt的输出里,文件名从第9列开始(前面是权限、所有者、大小、时间等信息),用循环拼接第9到最后一列,能正确处理带空格的文件名(比如Copy of Database.bak)。 - 最后判断是否获取到有效文件:如果有就执行下载和删除,下载时用
basename确保本地文件名和远程一致;如果没找到匹配文件,会输出提示信息,避免空操作。
注意事项
- 首次运行前,建议手动执行一次
ssh User@sft.domain.co.uk,确认服务器的主机密钥(避免脚本运行时弹出交互提示中断执行)。 - 如果你的备份文件命名规则有变化,可以调整通配符
*Database*.bak,比如改成Database*.bak或者*Database.bak来匹配更精准的范围。 - 脚本里的
password123是明文密码,生产环境中建议用更安全的方式(比如SSH密钥对)替代sshpass,避免密码泄露风险。
备注:内容来源于stack exchange,提问作者mouzzampk2014
相关产品推荐
相关产品推荐

