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

Linux环境下通过Bash脚本批量FTP上传非测试类前端文件

自动化增量FTP上传脚本(排除测试文件)

推荐方案:使用lftp实现简洁高效的增量同步

lftp是功能更强大的FTP客户端,原生支持增量同步、文件筛选,代码简洁可靠:

#!/bin/bash

# 配置参数,请根据实际情况修改
HOST="ftp-server.net"
USER="me"
PASSWORD="pss"
LOCAL_DIR="./"  # 本地文件根目录
REMOTE_DIR="www/public"  # 远程服务器目标根目录

# 执行增量上传,自动排除测试文件
lftp -f - <<EOF
open ftp://$USER:$PASSWORD@$HOST
mirror \
    --reverse \
    --only-newer \
    --exclude "T_*" \
    --include "*.js" \
    --include "*.css" \
    --include "*.html" \
    "$LOCAL_DIR" "$REMOTE_DIR"
bye
EOF

参数说明:

  • --reverse:将本地文件同步到远程服务器(反向镜像)
  • --only-newer:仅上传比远程版本更新的文件,实现增量上传
  • --exclude "T_*":排除所有以T_开头的测试文件
  • --include:指定只同步JS、CSS、HTML类型的文件
  • mirror默认递归处理子目录,无需额外配置

若系统未安装lftp,可通过包管理器安装:

  • Debian/Ubuntu:sudo apt install lftp
  • RHEL/CentOS:sudo yum install lftp

备选方案:基于原生ftp命令实现(逻辑较复杂)

若必须使用系统原生ftp命令,可通过时间戳对比实现增量上传,代码如下:

#!/bin/bash

# 配置信息
HOST="ftp-server.net"
USER="me"
PASSWORD="pss"
LOCAL_DIR="./"
REMOTE_BASE="www/public"

# 获取本地符合条件的文件列表:JS/CSS/HTML,排除T_开头的文件
LOCAL_FILES=$(find "$LOCAL_DIR" -type f \( -name "*.js" -o -name "*.css" -o -name "*.html" \) ! -name "T_*" | sed "s|^$LOCAL_DIR||")

# 启动FTP会话执行上传
ftp -inv "$HOST" <<EOF
user $USER $PASSWORD

$(for file in $LOCAL_FILES; do
    # 获取本地文件修改时间戳
    LOCAL_MTIME=$(stat -c "%Y" "$LOCAL_DIR/$file")
    
    # 确保远程目录存在
    REMOTE_DIR=$(dirname "$REMOTE_BASE/$file")
    echo "mkdir -p $REMOTE_DIR"
    echo "cd $REMOTE_DIR"
    
    # 检查远程文件是否存在并对比时间戳
    echo "quote MDTM $(basename "$file")"
    echo "if [ \$? -ne 0 ]; then"
    echo "    put \"$LOCAL_DIR/$file\""
    echo "else"
    echo "    REMOTE_MTIME_STR=\$(echo \$FTP_RESPONSE | awk '{print \$2}')"
    echo "    REMOTE_MTIME=\$(date -d \"\${REMOTE_MTIME_STR:0:4}-\${REMOTE_MTIME_STR:4:2}-\${REMOTE_MTIME_STR:6:2} \${REMOTE_MTIME_STR:8:2}:\${REMOTE_MTIME_STR:10:2}:\${REMOTE_MTIME_STR:12:2}\" +%s)"
    echo "    if [ \$LOCAL_MTIME -gt \$REMOTE_MTIME ]; then"
    echo "        put \"$LOCAL_DIR/$file\""
    echo "    fi"
    echo "fi"
    echo "cd $REMOTE_BASE"
done)

bye
EOF

注意事项:

  • 依赖stat和date命令处理时间戳,不同Linux发行版可能需要调整格式
  • 通过MDTM命令获取远程文件修改时间,部分FTP服务器可能不支持该命令
  • 逻辑较繁琐,仅在无法使用lftp时考虑

内容的提问来源于stack exchange,提问作者Jérémie Rousseau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:25:31