You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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"

逻辑说明

  1. 获取文件列表:用ls -1让每个文件名单独占一行,兼容带空格的特殊文件名;
  2. 逐个下载验证:对每个文件单独执行get命令,避免批量mget无法追踪单个文件状态的问题;
  3. 成功判定:通过检查本地文件是否存在且非空,确保下载的是完整有效的文件;
  4. 安全清理:下载失败时,自动删除本地可能生成的空文件,避免垃圾文件残留。

如果你的文件名都是无空格的简单格式,也可以用更简洁的循环方式,但上面的版本适配性更强,建议优先使用。

内容的提问来源于stack exchange,提问作者Ganesh

火山引擎 最新活动