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:
- 编辑定时任务:
crontab -e - 添加一行内容(替换成你的脚本路径):
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
相关产品推荐
相关产品推荐

