如何用脚本快速备份特定类型文件(附全平台代码)
目录导读
-
为什么需要脚本备份特定文件?

- 手动备份的痛点
- 脚本备份的核心优势
-
基础知识准备:脚本+文件筛选逻辑
- 文件通配符与正则表达式
- 平台差异说明(Windows/macOS/Linux)
-
实战代码:三款即用脚本
- 1 Windows PowerShell脚本(备份.jpg/.docx等)
- 2 Linux/macOS Bash脚本(备份.log/.pdf等)
- 3 跨平台Python脚本(任意扩展名组合)
-
脚本加强:增量备份与日志记录
- 自动跳过已备份文件
- 生成备份报告
-
常见问题问答(FAQ)
- Q1:脚本备份速度慢怎么办?
- Q2:如何备份二级子目录中的文件?
- Q3:能否通过邮件通知备份结果?
-
总结与最佳实践
为什么需要脚本备份特定类型文件?
手动备份的痛点
每天的工作中,你可能需要从海量文件中找出.pdf、.docx、.jpg等类型进行备份,手动复制粘贴不仅耗时,还容易遗漏或误选,如果目录深度超过3层,查找文件的时间甚至超过备份本身。
脚本备份的核心优势
- 一键执行:输入命令行或双击脚本,全自动完成。
- 精准筛选:通过扩展名、文件名模式、修改日期精准定位目标文件。
- 可重复性:定时任务(如每天凌晨3点)自动运行,无需人工干预。
- 跨平台:同一个Python脚本可在Windows、Linux、macOS上运行。
数据支撑:根据某IT运维团队统计,使用脚本后,50GB特定文件的备份时间从45分钟缩短至6分钟,且错误率降为0%。
基础知识准备:脚本+文件筛选逻辑
文件通配符与正则表达式
- 通配符:
*.docx匹配所有Word文件,*backup*匹配文件名含“backup”的文件。 - 正则表达式:
\.(jpg|png|gif)$匹配以.jpg/.png/.gif结尾的文件。
平台差异说明
| 平台 | 默认Shell | 文件路径分隔符 | 常用脚本工具 |
|---|---|---|---|
| Windows | PowerShell | robocopy, xcopy | |
| Linux/macOS | Bash/Zsh | cp, rsync | |
| 全平台 | Python | 或 | shutil, os.walk |
注意:建议使用
os.path.join()处理路径,避免平台兼容问题。
实战代码:三款即用脚本
1 Windows PowerShell脚本(备份.jpg/.docx等)
# backup_specific_files.ps1
$sourceDir = "C:\Users\YourName\Documents"
$destDir = "D:\Backup_$(Get-Date -Format 'yyyyMMdd')"
$extensions = @("*.jpg", "*.docx", "*.xlsx") # 修改为目标扩展名
# 如果目标目录不存在则创建
if (!(Test-Path $destDir)) { New-Item -ItemType Directory -Path $destDir }
# 使用Get-ChildItem递归搜索,用Copy-Item保留目录结构
Get-ChildItem -Path $sourceDir -Recurse -Include $extensions | ForEach-Object {
# 构建目标路径,保留原相对路径
$relativePath = $_.FullName.Replace($sourceDir, "")
$targetPath = Join-Path $destDir $relativePath
$targetDir = Split-Path $targetPath -Parent
if (!(Test-Path $targetDir)) { New-Item -ItemType Directory -Path $targetDir -Force }
Copy-Item $_.FullName $targetPath
}
Write-Host "备份完成,共处理 $((Get-ChildItem $destDir -Recurse -File).Count) 个文件"
使用方法:右键点击脚本 → “使用PowerShell运行”。
2 Linux/macOS Bash脚本(备份.log/.pdf等)
#!/bin/bash
# backup_specific_files.sh
SOURCE_DIR="/home/user/projects"
DEST_DIR="/mnt/backup/$(date +%Y%m%d)"
EXTENSIONS=("*.log" "*.pdf" "*.txt") # 修改为目标扩展名
# 如果目标目录不存在则创建
mkdir -p "$DEST_DIR"
# 使用find命令查找文件,并通过cp保留目录结构
find "$SOURCE_DIR" -type f \( -name "*.log" -o -name "*.pdf" -o -name "*.txt" \) -exec sh -c '
relpath="${1#$0/}" # 去掉源目录前缀
target="$1/$relpath" # 拼接目标路径
mkdir -p "$(dirname "$target")"
cp "$0/$relpath" "$target"
' {} "$SOURCE_DIR" "$DEST_DIR" \;
echo "备份完成,文件数:$(find "$DEST_DIR" -type f | wc -l)"
使用方法:
chmod +x backup_specific_files.sh
./backup_specific_files.sh
3 跨平台Python脚本(任意扩展名组合)
# backup_specific_files.py
import os
import shutil
from datetime import datetime
def backup_files(source, dest, extensions):
# extensions示例:['.jpg', '.docx', '.pdf']
if not os.path.exists(dest):
os.makedirs(dest)
count = 0
for root, dirs, files in os.walk(source):
for file in files:
if any(file.endswith(ext) for ext in extensions):
# 保留原目录结构
rel_path = os.path.relpath(root, source)
target_dir = os.path.join(dest, rel_path)
if not os.path.exists(target_dir):
os.makedirs(target_dir)
src_file = os.path.join(root, file)
dst_file = os.path.join(target_dir, file)
shutil.copy2(src_file, dst_file) # 保留元数据
count += 1
print(f"备份完成,共处理 {count} 个文件")
if __name__ == "__main__":
source = r"C:\Users\YourName\Documents" # 替换为实际路径
dest = f"D:\\Backup_{datetime.now().strftime('%Y%m%d')}"
backup_files(source, dest, ['.jpg', '.docx', '.xlsx', '.pdf'])
优点:
- 同时支持Windows、Linux、macOS。
- 可以自由增删扩展名列表。
- 简洁易懂,适合二次开发。
脚本加强:增量备份与日志记录
自动跳过已备份文件
使用rsync(Linux/macOS)或robocopy(Windows)的增量模式:
# Linux使用rsync增量备份(只复制新文件)
rsync -av --include='*/' --include='*.jpg' --include='*.docx' --exclude='*' \
/home/user/data/ /mnt/backup/incremental/
-a:归档模式,保留权限和时间戳。--include/--exclude:精确定义要同步的文件类型。
生成备份报告
在Python脚本末尾添加:
with open(os.path.join(dest, "backup_report.txt"), "w") as report:
report.write(f"备份时间:{datetime.now()}\n")
report.write(f"源目录:{source}\n")
report.write(f"目标目录:{dest}\n")
report.write(f"备份文件类型:{extensions}\n")
report.write(f"文件数量:{count}\n")
常见问题问答(FAQ)
Q1:脚本备份速度慢怎么办?
答案:
- 使用多线程技术,Python中可以用
threading或concurrent.futures并行复制文件,速度提升3-5倍。 - 对于大文件(>500MB),优先使用
shutil.copyfileobj(块复制)而非shutil.copy2。 - 将源目录和目标目录放在同一物理磁盘上,避免网络传输瓶颈。
Q2:如何备份二级子目录中的文件?
答案:
上述脚本均使用-Recurse(PowerShell)、find(Bash)或os.walk()(Python),默认会递归搜索所有子目录,如果要限制深度,可以在Bash中使用-maxdepth 3参数,或者在Python中给os.walk添加层级判断。
Q3:能否通过邮件通知备份结果?
答案:
可以,在脚本末尾集成SMTP发送功能,Python示例:
import smtplib
from email.mime.text import MIMEText
def send_email(subject, body):
msg = MIMEText(body)
msg["Subject"] = subject
msg["From"] = "your_email@example.com"
msg["To"] = "admin@example.com"
with smtplib.SMTP("smtp.example.com", 587) as server:
server.starttls()
server.login("your_email@example.com", "password")
server.send_message(msg)
总结与最佳实践
核心结论:
用脚本备份特定类型文件,本质是 “文件遍历+条件筛选+复制/移动” 三个步骤的组合,无论是Windows、Linux还是跨平台Python,都有一套成熟的解决方案。
最佳实践建议:
- 测试先行:在非生产环境先运行脚本,确认筛选规则正确。
- 版本控制:将脚本放在Git仓库中,记录每次修改。
- 定时执行:
- Windows:使用任务计划程序,设置每天/每周自动运行。
- Linux:添加cron任务,如
0 3 * * * /path/to/script.sh(每天凌晨3点)。
- 保留备份日志:每次备份生成一个日志文件,方便事后审计。
将上面的脚本稍作修改(替换源路径、目标路径和扩展名),你就拥有了一套零成本、高可靠性的文件备份系统,从今天开始,让脚本为你守护重要数据,把宝贵的时间留给更有价值的工作。