You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求修改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确保本地文件名和远程一致;如果没找到匹配文件,会输出提示信息,避免空操作。

注意事项

  1. 首次运行前,建议手动执行一次ssh User@sft.domain.co.uk,确认服务器的主机密钥(避免脚本运行时弹出交互提示中断执行)。
  2. 如果你的备份文件命名规则有变化,可以调整通配符*Database*.bak,比如改成Database*.bak或者*Database.bak来匹配更精准的范围。
  3. 脚本里的password123是明文密码,生产环境中建议用更安全的方式(比如SSH密钥对)替代sshpass,避免密码泄露风险。

备注:内容来源于stack exchange,提问作者mouzzampk2014

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 08:34:29