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
相关产品推荐
相关产品推荐

