上一篇
按计算机时间批量复制文件夹
- 行业动态
- 2025-05-16
- 5
编写脚本获取系统时间,格式化为文件夹名,遍历源文件夹并复制
需求分析
需要根据计算机系统时间(如日期/时间)自动批量复制文件夹,常见场景包括:
- 定时备份(如每天备份一次)
- 按时间戳归档(如每小时生成一个副本)
- 自动化数据迁移(如每周固定时间同步)
实现方案
(一)Windows系统
工具 | 适用场景 | 特点说明 |
---|---|---|
批处理脚本+任务计划 | 定时触发复制操作 | 简单易用,适合基础需求 |
PowerShell脚本 | 复杂逻辑控制/动态路径生成 | 支持高级操作 |
Robocopy | 高效文件复制 | 支持增量复制和日志记录 |
示例:每日自动备份文件夹
@echo off set "SOURCE=C:SourceFolder" set "TARGET=D:Backup_%DATE:~0,10%" REM 按日期命名目标文件夹 xcopy "%SOURCE%" "%TARGET%" /E /I /Y
任务计划配置
- 打开「任务计划程序」→ 创建基本任务
- 触发器:每天指定时间
- 操作:启动程序 → 选择上述
.bat
文件 - 启用「即使任务未成功完成也停止」选项
(二)Linux系统
工具 | 适用场景 | 特点说明 |
---|---|---|
Cron+Shell | 定时任务 | 灵活度高,适合服务器环境 |
rsync | 高效增量复制 | 支持断点续传 |
Pacud | 可视化定时任务管理 | 图形化界面操作 |
示例:每小时备份数据库文件夹
#!/bin/bash SOURCE=/var/lib/mysql TARGET=/backup/$(date +%Y%m%d%H)_database rsync -av --delete $SOURCE $TARGET
Cron配置
# 编辑crontab crontab -e # 添加以下行(每小时第5分钟执行) 05 /path/to/backup.sh >> /var/log/backup.log 2>&1
关键技术点
动态路径生成:
- Windows:
%DATE:~0,10%
提取当前日期(YYYY-MM-DD) - Linux:
$(date +%Y%m%d)
生成日期字符串 - 时间戳:
%TIME:~0,8%
(Windows)或$(date +%H%M)
(Linux)
- Windows:
防覆盖机制:
- 在目标文件夹名中加入时间变量
- 使用
robocopy /MIR
或rsync --update
进行智能覆盖
日志记录:
- Windows:
>> log.txt
重定向输出 - Linux:
>> /var/log/backup.log
集中日志管理
- Windows:
常见问题与解决方案
问题现象 | 解决方案 |
---|---|
权限不足导致复制失败 | 右键脚本→属性→兼容性→勾选「以管理员身份运行」 |
中文路径出现乱码 | 在脚本开头添加:chcp 65001 (Windows)或LANG=en_US.UTF-8 (Linux) |
跨分区复制速度慢 | 启用Write-Through缓存(Windows)或使用ionice 调整IO优先级(Linux) |
任务重复执行导致冲突 | 添加互斥锁:if exist lock.txt exit (Windows)或flock /tmp/lockfile (Linux) |
扩展功能建议
- 压缩存档:在复制后自动打包成ZIP/TAR.GZ格式(节省存储空间)
- 差异对比:使用
fc
(Windows)或diff
(Linux)生成文件差异报告 - 邮件通知:通过Blat(Windows)或Mailx(Linux)发送操作结果邮件
【相关问题与解答】
Q1:如何修改脚本使目标文件夹按”年-月-日_时-分”格式命名?
A1:调整路径变量定义方式:
- Windows:
set "TARGET=D:Backup_%DATE:~0,10%_%TIME:~0,5%"
- Linux:
TARGET=/backup/$(date +%Y-%m-%d_%H-%M)_database
Q2:复制过程中如何排除特定文件类型?
A2:使用过滤参数:
- Robocopy:
/XF .tmp
(排除所有临时文件) - Rsync:
--exclude='.swp'
(