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

Shell脚本筛选每日早8点生成文件并FTP传输的技术求助

解决每日筛选早8点文件并FTP发送的Shell脚本方案

嘿,作为Shell编程新手能想到用自动化脚本处理日常任务,已经超棒啦!我来帮你一步步搞定这个需求——精准筛选每日早8点生成的.txt文件,再通过FTP自动发送出去。

核心思路拆解

你的需求主要分两部分:精准定位目标文件 + 自动化FTP传输,我们可以分步骤实现,再整合成完整可用的脚本。

一、筛选早8点的文件

这里有两种靠谱的方式,你可以根据自己的文件名格式灵活选择:

1. 按文件名中的时间戳筛选(如果文件名自带日期时间)

假设你的文件名格式类似data_20240520_081234.txt(前缀_YYYYMMDD_HHMMSS.txt),我们可以用find结合正则表达式,精准匹配小时为08的文件:

find /你的源文件目录路径 -type f -name "*.txt" -regextype posix-extended -regex ".*/.*_[0-9]{8}_08[0-9]{4}\.txt"
  • 细节说明:[0-9]{8}匹配8位日期(比如20240520),08[0-9]{4}匹配8点开头的时分秒(比如081234),确保只选中早8点生成的文件。

2. 按文件实际修改时间筛选(更准确,适合文件名不带时间的情况)

如果文件名没有时间戳,我们可以通过文件的修改时间定位当天8点到9点之间的文件:

find /你的源文件目录路径 -type f -name "*.txt" -newermt "today 08:00" ! -newermt "today 09:00"
  • 细节说明:-newermt "today 08:00"表示比今天8点新的文件,! -newermt "today 09:00"表示不比今天9点新,合起来就是8点到9点之间修改的文件。

二、收集并FTP发送文件

筛选到目标文件后,我们先把它们暂存到临时目录,再通过FTP批量发送,避免误操作源文件。

1. 完整脚本示例

把以下内容保存为daily_ftp_collect.sh,记得替换成你自己的配置参数:

#!/bin/bash

# -------------------------- 配置参数 --------------------------
SOURCE_DIR="/home/yourname/data_files"  # 源文件所在目录
TEMP_DIR="/tmp/daily_8am_files"         # 临时存放筛选出的文件
FTP_SERVER="ftp.yourcompany.com"        # FTP服务器地址
FTP_USER="your_ftp_username"            # FTP用户名
FTP_PASS="your_ftp_password"            # FTP密码(建议用下面的安全方式)
FTP_REMOTE_DIR="/daily_data"            # FTP远程目标目录
# -------------------------------------------------------------

# 创建并清理临时目录
mkdir -p "$TEMP_DIR"
rm -f "$TEMP_DIR"/*.txt

# 筛选文件(二选一,注释掉另一个即可)
echo "正在筛选当日早8点的文件..."
# 方式1:按文件名筛选
find "$SOURCE_DIR" -type f -name "*.txt" -regextype posix-extended -regex ".*/.*_[0-9]{8}_08[0-9]{4}\.txt" -exec cp {} "$TEMP_DIR"/ \;
# 方式2:按修改时间筛选
# find "$SOURCE_DIR" -type f -name "*.txt" -newermt "today 08:00" ! -newermt "today 09:00" -exec cp {} "$TEMP_DIR"/ \;

# 检查是否有文件需要发送
if [ $(ls -1 "$TEMP_DIR"/*.txt 2>/dev/null | wc -l) -eq 0 ]; then
    echo "未找到符合条件的文件,脚本退出。"
    rmdir "$TEMP_DIR"
    exit 0
fi

# FTP上传文件(用here-doc方式,逻辑更直观)
echo "开始FTP上传..."
ftp -n "$FTP_SERVER" << EOF
user $FTP_USER $FTP_PASS
binary  # 二进制模式传输,避免文本文件乱码
cd $FTP_REMOTE_DIR
mput $TEMP_DIR/*.txt  # 批量上传临时目录的所有txt文件
quit
EOF

# 清理临时目录
echo "清理临时文件..."
rm -rf "$TEMP_DIR"

echo "文件收集与FTP发送完成!"

2. 安全优化:避免明文密码

脚本里写明文密码不太安全,你可以用~/.netrc文件存储FTP凭证:

  • 创建~/.netrc文件,内容如下:
    machine ftp.yourcompany.com login your_ftp_username password your_ftp_password
    
  • 设置文件权限为600(只有自己能读写):
    chmod 600 ~/.netrc
    
  • 然后修改脚本里的FTP部分,去掉密码参数:
    ftp -n "$FTP_SERVER" << EOF
    user $FTP_USER
    binary
    cd $FTP_REMOTE_DIR
    mput $TEMP_DIR/*.txt
    quit
    EOF
    

三、设置定时任务(自动每日执行)

如果要让脚本每天自动运行(比如每天9点,确保8点的文件都已生成),可以用cron:

  1. 编辑定时任务:
    crontab -e
    
  2. 添加一行内容(替换成你的脚本路径):
    0 9 * * * /home/yourname/scripts/daily_ftp_collect.sh >> /var/log/daily_ftp_collect.log 2>&1
    
  • 细节说明:0 9 * * *表示每天9点整执行,>> /var/log/...表示把脚本输出保存到日志文件,方便后续排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:25:52