如何结合find命令实现目录多文件远程FTP传输(含定时任务需求)
结合find命令与FTP脚本实现定时备份文件传输
嘿,我来帮你把find命令和现有的FTP脚本整合起来,精准传输符合条件的备份文件,还能设置定时自动执行~
修改后的完整FTP传输脚本
首先,我们需要调整原脚本,让它能精准处理find命令筛选出的文件,避免传输整个目录的冗余文件。下面是修改后的脚本:
#!/bin/sh # 配置FTP服务器信息 USERNAME="your_ftp_username" PASSWORD="your_ftp_password" SERVER="your_ftp_server_ip" # 本地备份目录路径 LOCAL_BACKUP_DIR="/home/backup" # 生成远程备份目录的时间戳 DATE=$(date +%Y-%m-%d-%H.%M.%S) REMOTE_BACKUPDIR="/backup/${DATE}/" # 切换到本地备份目录,避免处理绝对路径的麻烦 cd "$LOCAL_BACKUP_DIR" || { echo "无法访问本地备份目录 $LOCAL_BACKUP_DIR,脚本退出"; exit 1; } # 创建临时文件存储符合条件的文件列表 TMP_FILE=$(mktemp) # 用find命令筛选出近1天且超过59分钟的.tar.gz文件,存入临时文件 find . -mtime -1 -mmin +59 -type f -name "*.tar.gz*" > "$TMP_FILE" # 检查是否找到有效文件,避免空连接FTP服务器 if [ ! -s "$TMP_FILE" ]; then echo "未找到符合条件的.tar.gz备份文件,无需执行传输" rm "$TMP_FILE" exit 0 fi # 启动FTP传输流程 ftp -inv "$SERVER" <<EOF user $USERNAME $PASSWORD mkdir $REMOTE_BACKUPDIR cd $REMOTE_BACKUPDIR # 遍历临时文件中的列表,逐个传输文件 $(while read -r file; do echo "put \"$file\""; done < "$TMP_FILE") quit EOF # 清理临时文件,避免残留 rm "$TMP_FILE"
脚本关键说明
- 切换本地目录:先进入
/home/backup,让find输出相对路径,避免FTP处理绝对路径时出现问题 - 临时文件存储列表:用
mktemp创建安全的临时文件,存储筛选后的文件路径,能兼容带空格或特殊字符的文件名 - 空文件检查:如果没有符合条件的文件,直接退出,避免无效的FTP连接
- 逐个传输文件:通过while循环生成
put命令,比mput更可靠,尤其是处理特殊文件名时
设置Cron定时任务
接下来我们把这个脚本设置成定时自动执行,比如每天凌晨2点运行:
- 先给脚本添加执行权限:
chmod +x /path/to/ftp_backup.sh
(把/path/to/替换成你实际保存脚本的路径)
- 编辑crontab配置:
crontab -e
- 在文件末尾添加一行定时规则:
0 2 * * * /path/to/ftp_backup.sh >> /var/log/ftp_backup.log 2>&1
- 这条规则表示每天凌晨2点执行脚本
- 后面的
>> /var/log/ftp_backup.log 2>&1会把脚本的输出和错误信息写入日志文件,方便后续排查问题
注意事项
- 替换脚本中的
USERNAME、PASSWORD、SERVER为你的实际FTP服务器信息 - 确保系统中安装了ftp客户端(Debian/Ubuntu可执行
apt install ftp,CentOS/RHEL可执行yum install ftp) - 手动执行一次脚本测试:
/path/to/ftp_backup.sh,确认能正常传输文件
内容的提问来源于stack exchange,提问作者Catbear
相关产品推荐
相关产品推荐

