百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

编写脚本,实现对指定目录下所有文件备份,并压缩存到其他位置

gudong366 2025-05-04 14:29 8 浏览

想象一下,你是一个运维工程师,负责管理一台生产服务器。某天凌晨,业务系统因为一次误操作删除了关键数据,老板怒气冲冲地找到你:“数据呢?备份呢?”如果你事先写好了一个备份脚本,定时运行,甚至还能压缩存储节省空间,那你就可以淡定地回复:“别慌,数据我已经备份好了。”这种底气,来自于你对工具的掌控和对细节的把控。

这个脚本的目标很简单:

  1. 指定一个源目录,扫描里面的所有文件。
  2. 将这些文件备份到目标位置。
  3. 用压缩工具打包备份,节省磁盘空间。
  4. 加上时间戳,让每次备份都有迹可循。

看似简单,但细节决定成败。我们会从基础命令讲起,一步步带你实现这个脚本。

准备工作:工具与环境

在动手之前,我们需要确保环境就绪。假设你用的是Linux系统(比如Ubuntu、CentOS),以下是我们会用到的工具和命令:

  • bash:Shell脚本的运行环境,通常Linux默认就是它。可以用echo $SHELL检查是否为/bin/bash
  • cp:用于复制文件和目录。
  • tar:经典的压缩工具,支持打包和压缩。
  • date:生成时间戳,方便追踪备份时间。
  • mkdir:创建目录。
  • ls:列出目录内容(虽然我们不常用它,但了解一下有备无患)。
  • find:查找文件的神器(稍后会用到)。

确保这些命令可用,运行which cp tar date mkdir ls find检查它们的路径。如果某个命令缺失,可以用包管理器安装(比如apt install taryum install tar)。


脚本设计:从需求到实现

我们先明确需求:

  • 输入:源目录路径(比如/var/www/data)。
  • 输出:备份文件,压缩后存到目标目录(比如/backup)。
  • 功能:备份所有文件,带时间戳,压缩为.tar.gz格式。
  • 额外要求:脚本要健壮,能处理目录不存在、权限不足等情况。

基于此,我们设计一个脚本,命名为backup.sh。以下是逐步实现的过程。


动手写脚本

1. 创建脚本文件并添加解释器

新建文件:

touch backup.sh
chmod +x backup.sh  # 赋予执行权限

用编辑器(比如vimnano)打开,写入第一行:

#!/bin/bash

这告诉系统用bash解释器运行脚本。

2. 定义变量

为了让脚本灵活,我们用变量存储路径和时间戳:

# 源目录(需要备份的目录)
SOURCE_DIR="/var/www/data"

# 目标目录(备份存储位置)
BACKUP_DIR="/backup"

# 当前时间戳,格式为年月日-时分秒,例如 20250330-143022
TIMESTAMP=$(date +"%Y%m%d-%H%M%S")

# 备份文件名
BACKUP_FILE="backup-$TIMESTAMP.tar.gz"
  • date +"%Y%m%d-%H%M%S":生成如20250330-143022的时间戳。%Y是年,%m是月,%d是日,%H是小时,%M是分钟,%S是秒。
  • 用变量的好处是后续修改路径或文件名时只需调整这里。

3. 检查目录是否存在

脚本不能假设一切顺利,我们得先检查目录:

# 检查源目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
    echo "错误:源目录 $SOURCE_DIR 不存在!"
    exit 1
fi

# 检查目标目录是否存在,不存在则创建
if [ ! -d "$BACKUP_DIR" ]; then
    echo "目标目录 $BACKUP_DIR 不存在,正在创建..."
    mkdir -p "$BACKUP_DIR"
    if [ $? -ne 0 ]; then  # 检查mkdir是否成功
        echo "错误:无法创建目标目录 $BACKUP_DIR,请检查权限!"
        exit 1
    fi
fi
  • [ ! -d "$SOURCE_DIR" ]-d测试目录是否存在,!取反,条件为真表示目录不存在。
  • exit 1:退出脚本,返回非零状态码表示失败。
  • mkdir -p:递归创建目录,即使父目录不存在也不会报错。
  • $?:上一个命令的退出状态,0表示成功,非0表示失败。

4. 执行备份与压缩

核心功能来了:备份并压缩。我们用tar命令一步到位:

echo "开始备份 $SOURCE_DIR 到 $BACKUP_DIR/$BACKUP_FILE ..."
tar -czf "$BACKUP_DIR/$BACKUP_FILE" -C "$SOURCE_DIR" .
if [ $? -eq 0 ]; then
    echo "备份成功!文件保存为:$BACKUP_DIR/$BACKUP_FILE"
else
    echo "错误:备份失败,请检查权限或磁盘空间!"
    exit 1
fi
  • tar -czf
  • -c:创建新归档文件。
  • -z:用gzip压缩。
  • -f:指定输出文件。
  • -C "$SOURCE_DIR" .:切换到源目录后打包当前目录(.)的内容,避免在压缩包中包含完整路径。
  • 检查$?确保备份成功。

5. 完整脚本

把以上部分合起来,backup.sh如下:

#!/bin/bash

# 源目录(需要备份的目录)
SOURCE_DIR="/var/www/data"

# 目标目录(备份存储位置)
BACKUP_DIR="/backup"

# 当前时间戳,格式为年月日-时分秒,例如 20250330-143022
TIMESTAMP=$(date +"%Y%m%d-%H%M%S")

# 备份文件名
BACKUP_FILE="backup-$TIMESTAMP.tar.gz"

# 检查源目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
    echo "错误:源目录 $SOURCE_DIR 不存在!"
    exit 1
fi

# 检查目标目录是否存在,不存在则创建
if [ ! -d "$BACKUP_DIR" ]; then
    echo "目标目录 $BACKUP_DIR 不存在,正在创建..."
    mkdir -p "$BACKUP_DIR"
    if [ $? -ne 0 ]; then
        echo "错误:无法创建目标目录 $BACKUP_DIR,请检查权限!"
        exit 1
    fi
fi

# 执行备份与压缩
echo "开始备份 $SOURCE_DIR 到 $BACKUP_DIR/$BACKUP_FILE ..."
tar -czf "$BACKUP_DIR/$BACKUP_FILE" -C "$SOURCE_DIR" .
if [ $? -eq 0 ]; then
    echo "备份成功!文件保存为:$BACKUP_DIR/$BACKUP_FILE"
else
    echo "错误:备份失败,请检查权限或磁盘空间!"
    exit 1
fi

测试与优化

测试脚本

保存后运行:

./backup.sh

如果/var/www/data有文件(比如test.txt),你会在/backup下看到类似backup-20250330-143022.tar.gz的文件。用tar -xzf解压验证:

tar -xzf /backup/backup-20250330-143022.tar.gz -C /tmp

检查/tmp下是否还原了文件。

优化建议

  1. 支持参数输入

修改脚本接受命令行参数:

SOURCE_DIR=${1:-"/var/www/data"}
BACKUP_DIR=${2:-"/backup"}

运行时可指定路径:./backup.sh /data /backup

  1. 日志记录

添加日志:

LOG_FILE="/var/log/backup.log"
echo "$(date): 备份完成,文件:$BACKUP_DIR/$BACKUP_FILE" >> "$LOG_FILE"
  1. 清理旧备份

删除7天前的备份:

find "$BACKUP_DIR" -name "backup-*.tar.gz" -mtime +7 -exec rm -f {} \;
  • -mtime +7:修改时间超过7天的文件。
  • -exec rm -f {} \;:删除匹配的文件。

进阶命令

  • find:查找文件非常强大。例如,备份特定类型文件:
tar -czf "$BACKUP_FILE" $(find "$SOURCE_DIR" -name "*.txt")
  • rsync:如果需要增量备份,可以替换cp
rsync -av "$SOURCE_DIR/" "$BACKUP_DIR/temp" && tar -czf "$BACKUP_FILE" -C "$BACKUP_DIR/temp" .
  • gzip vs bzip2 vs xztar -czf用gzip,-j用bzip2,-J用xz,压缩率依次递增,但速度递减。

运维中的实际应用

这个脚本虽小,却能融入更大的运维体系。比如:

  • cron定时运行:crontab -e添加0 2 * * * /path/to/backup.sh,每天凌晨2点备份。
  • 结合云存储:备份后用scpaws s3 cp上传到远程服务器。

相关推荐

U盘文件被删怎么简单恢复(u盘里的文件被误删了怎么找回)

现在这个社会不是靠关系靠路子,主要还是靠实力。刘强在机关工作,人长得帅气,工作能力又强。唯独一样不好,脾气太大,动不动就发火,因为小事常和同事发生口角。一次他火大的差点把办公桌给掀翻了,领导见他野蛮的...

不小心删除了一些文件?9 个最佳免费硬盘恢复软件

恢复您曾经无意或意外删除的所有文件和数据。您是否曾经错误地删除了一个对您的工作至关重要并导致您丢失所有进度的文件?我们为您提供了一些最好的免费硬盘恢复软件,以帮助您恢复意外删除的文件,以解决您的文件删...

Studio 中文版:数据救援神器,误删 / 分区损坏 / RAID 恢复一键找回

Studio中文版:数据救援神器,误删/分区损坏/RAID恢复一键找回当文件意外删除、分区损坏,或RAID阵列崩溃时,一款可靠的数据恢复工具往往能挽回关键损失。R-Studio中文版...

你值得拥有的11款Linux数据恢复工具

如果你使用的是Linux操作系统,那么你一定想知道一旦硬盘崩溃的话又该如何保存和恢复数据。其实,现在有很多Linux数据恢复工具可以让我们摆脱数据安全的困扰。小编已经为各位准备好了一些最好的Linux...

误删文件内容怎么恢复(误删文件内容怎么恢复回来)

  在日常使用电脑的过程中,误删文件的情况时有发生。无论是由于操作失误还是病毒攻击,误删文件都会给我们带来不小的困扰。幸运的是,随着技术的发展,误删文件恢复已不再是难题。本文将介绍几款国内外知名的误删...

u盘如何恢复删除的文件?推荐5款u盘数据恢复软件!

在日常生活与工作中,U盘作为便捷的数据存储载体,频繁用于传输和保存各类重要文件。然而,误删文件的情况却时有发生,无论是珍贵的照片、重要的工作文档,还是精心制作的视频,一旦删除,都可能带来不小的麻烦。...

怎么恢复删除的数据?5种有效的数据恢复方法汇总!

在数字化办公与生活的时代,电脑里的每一份数据都承载着重要信息。然而,一个误操作就可能导致数据被删除,无论是尚未保存的重要文档,还是珍藏多年的照片,都可能瞬间“消失”。但其实,数据删除并不意味着永久丢...

u盘删除文件怎么找回?5个数据恢复工具汇总,助你巧妙恢复数据!

在日常使用U盘的过程中,误删文件的情况时有发生,重要的工作文档、珍贵的照片视频一旦消失,难免让人焦急万分。别担心,只要选对数据恢复工具,被删除的数据仍有找回的可能。下面就为你汇总5款实用的数据...

Linux下恢复误删文件:思路+实践(linux删除如何恢复)

周五篮球群里有人问误删文件了怎么恢复,得知是ext4文件系统之后我推荐了ext4magic这个工具,然后又有人提到了xfs的话怎么办,正好前几天看到DaveChinner在邮件列表里提到了这个问题,...

苹果放大招!不用虚拟机了,Mac直接跑Linux容器,开发者效率翻倍

苹果这次真给开发者送福利了!今天凌晨(6月10日),苹果在官宣的Containerization框架直接炸了技术圈——Mac现在能原生运行Linux容器镜像了!这可不是虚拟机那种“套娃”方案,而是基...

7 款老牌经典软件,值得收藏(经典老歌软件)

Calibrehttps://calibre-ebook.com/Calibre是一个电脑电子书管理软件。肯定有人说了,电子书还要管理?那当然了。它的功能更强大的让你想象不到,首先它可以导入PDF,...

神仙级的免费开源电子书阅读器,还支持听书功能

神仙级的免费开源电子书阅读器,还支持听书功能,极空间部署『KoodoReader』哈喽小伙伴们好,我是Stark-C~前段时间不是给大家分享的电子书管理工具『TaleBook』嘛~,然后就有粉丝私信...

如何在Ubuntu系统中重置root密码(ubuntu忘记密码重置root密码命令)

很多人有个问题,就是喜欢把密码设置得很长很复杂,结果谁也没防住,却成功防住了自己ヽ(.ˇдˇ;)ノ对于现代人,特别是年轻人,都有过忘记密码的经历吧。在这篇文章中,我们来了解如何在Ubuntu1...

5款功能强大的PDF阅读器,让PDF阅读更轻松

分享5款功能强大的PDF阅读器,拥有丰富的PDF阅读工具,支持PDF文档划线、笔记、标记等操作,让PDF阅读更轻松!1.嗨动PDF编辑器一款实用的PDF处理软件,不仅可以阅读PDF文档,还能直接编辑、...

上班摸鱼利器! 免费好用的电子书阅读器,NAS轻松部署Koodo Reader

哈喽,大家好我是生活爱好者。笔者也是一名小说爱好者,平时用手机用某信读书,会员也开了,在家看体验也不错,但是上班的时候,在工作快速完成之后,想摸个鱼用手机就不太方便啦,作为爱折腾的人,必须要工作认真,...