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

如何在FTP中检查文件是否存在?Shell脚本报错求助

修复FTP操作Shell脚本的无效命令错误

原脚本的核心问题是把Shell的if条件判断直接写到了FTP会话的Here Document中,而FTP命令行环境无法识别Shell语法,这才触发了无效命令错误。下面是修正后的完整脚本,同时实现了文件存在判断、删除及上传逻辑:

修正后的脚本

#!/bin/sh
LOCALPATH="/var/opt/list"
DATE=$(date +'%Y%m%d%H')
HOST="10.123.456.18"
USER="admin"
PSWD="admin"
DIR="/var/opt/check"
DIR2="/var/opt/final"
# 临时文件存储FTP服务器上的文件列表
TEMP_FILE=$(mktemp)

# 第一步:获取FTP服务器$DIR目录下的文件列表到临时文件
ftp -in $HOST <<EOF > $TEMP_FILE
quote USER $USER
quote PASS $PSWD
cd $DIR
ls
quit
EOF

# 第二步:遍历本地$LOCALPATH下的SME*文件
cd "$LOCALPATH"
for local_file in SME*; do
    # 检查文件是否存在(避免通配符匹配不到文件时的问题)
    if [ -f "$local_file" ]; then
        # 检查当前文件是否在FTP服务器的$DIR目录中
        if grep -q "^$local_file" "$TEMP_FILE"; then
            # 标记需要删除的文件
            delete_cmds="$delete_cmds
rm $local_file"
        fi
        # 标记需要上传的文件
        upload_cmds="$upload_cmds
put $local_file $DIR2/$local_file"
    fi
done

# 第三步:执行FTP删除(如果有)和上传操作
if [ -n "$delete_cmds" ] || [ -n "$upload_cmds" ]; then
    ftp -in $HOST <<EOF
quote USER $USER
quote PASS $PSWD
cd $DIR
$delete_cmds
cd $DIR2
$upload_cmds
quit
EOF
fi

# 清理临时文件
rm -f "$TEMP_FILE"

关键修正点说明

  • 分离Shell逻辑与FTP会话:先通过FTP获取服务器文件列表到本地临时文件,再用Shell的grep和循环判断文件是否存在,避免在FTP会话中使用Shell语法。
  • 处理通配符边界情况:添加[ -f "$local_file" ]判断,防止本地没有匹配到SME*文件时出现错误。
  • 分阶段执行FTP命令:先收集需要删除和上传的命令,再一次性执行FTP会话,减少连接次数。
  • 使用mktemp创建临时文件:避免硬编码临时文件名,提升脚本安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:30:49