SFTP脚本优化需求:仅删除成功拉取的远程.txt文件
解决SFTP仅删除成功下载文件的问题
嘿,我来帮你搞定这个需求!你的原始脚本不管文件下载是否成功,都会直接删除远程所有.txt文件,这显然有风险。咱们调整成只删除那些成功拉取到本地的文件就好,下面是最稳妥的实现方案:
方案:逐个文件验证后删除
这个思路是先获取远程目标目录下的所有.txt文件列表,然后逐个尝试下载,确认下载成功后再删除对应的远程文件。这样能精准控制删除范围,避免误删。
#!/bin/bash # 配置远程服务器信息 REMOTE_USER="user" REMOTE_SERVER="server" REMOTE_DIR="/test" # 获取远程目录下的所有.txt文件(每行一个,支持带空格的文件名) REMOTE_FILE_LIST=$(sftp -b - "$REMOTE_USER@$REMOTE_SERVER" << EOF cd $REMOTE_DIR ls -1 *.txt quit EOF ) # 循环处理每个文件 while IFS= read -r REMOTE_FILE; do # 跳过空行或"无此文件"的提示信息 if [[ -z "$REMOTE_FILE" || "$REMOTE_FILE" == *"No such file"* ]]; then continue fi # 尝试下载单个文件 sftp "$REMOTE_USER@$REMOTE_SERVER" << EOF cd $REMOTE_DIR get "$REMOTE_FILE" quit EOF # 验证下载是否成功:本地文件存在且不为空 if [[ -f "$REMOTE_FILE" && -s "$REMOTE_FILE" ]]; then # 下载成功,删除远程文件 sftp "$REMOTE_USER@$REMOTE_SERVER" << EOF cd $REMOTE_DIR rm "$REMOTE_FILE" quit EOF echo "✅ 成功下载并删除远程文件: $REMOTE_FILE" else echo "❌ 下载失败,保留远程文件: $REMOTE_FILE" # 清理本地可能产生的空文件 rm -f "$REMOTE_FILE" fi done <<< "$REMOTE_FILE_LIST"
逻辑说明
- 获取文件列表:用
ls -1让每个文件名单独占一行,兼容带空格的特殊文件名; - 逐个下载验证:对每个文件单独执行
get命令,避免批量mget无法追踪单个文件状态的问题; - 成功判定:通过检查本地文件是否存在且非空,确保下载的是完整有效的文件;
- 安全清理:下载失败时,自动删除本地可能生成的空文件,避免垃圾文件残留。
如果你的文件名都是无空格的简单格式,也可以用更简洁的循环方式,但上面的版本适配性更强,建议优先使用。
内容的提问来源于stack exchange,提问作者Ganesh




