bash - 如何在 shell 脚本中压缩旧目录?

标签 bash shell scripting directory tar

作为部署过程的一部分,我在/opt/backup/{backupDirectory} 中创建备份目录。

因为备份添加在一起时可能会占用大量空间,但由于策略需要保留,所以我想使用稍微不同的名称单独压缩它们。

在/opt/backup/内,backupDirectory 的名称类似于 {site}-%Y%m%d,并包含一个名称为日期和时间的 md5 校验和的目录:

dateTime=$(date --rfc-3339=seconds);
checkSum=`md5sum <<<"$dateTime" | cut -d" " -f1`;

dateForName=$(date +%Y%m%d);

这允许在单个日期进行多次部署的情况下实现唯一性,而不会因为我的校验和而感到奇怪。

示例如下/opt/backup/site-20151125/aa55596ecfb369c537cac404af5e23fc/。

我想将指定日期的目录:site-20151125 打包到其自己的 tarball 中,但前提是该目录早于可配置的 +mtime。

这是我一直在尝试的,但循环似乎贯穿子目录,我只希望脚本可见一层深度。

log这是一个自定义日志记录函数,它只是以预定格式将消息记录到配置文件中。

为了简化测试,我们将 numDaysForCompression 设置为 1。

function compressBackups {
    numDaysForCompression=1;
    homeForTheCompressed="/opt/backup/compressed";
    compressedFileName="backup-site-$dateForName-$checkSum.tgz";

    if [[ -d $homeForTheCompressed ]]; then
        logThis "Home for compressed backups already exists.";
        echo "Home for compressed backups already exists.";
    else
        logThis "No home for compressed backups detected.";
        echo "No home for compressed backups detected.";

        logThis  "Creating: $homeForTheCompressed.";
        echo  "Creating: $homeForTheCompressed.";

        mkdir $homeForTheCompressed;
    fi

    logThis "Using $homeForTheCompressed to store backups over $numDaysForCompression days old.";

    datedBackups=($(find -d /opt/backup/site/ -mtime +$numDaysForCompression));
    for individualBackupDirectory in ${datedBackups[@]}
    do
        #tar -cvfz $compressedFileName $individualBackupDirectory;
        echo $individualBackupDirectory;
    done
}

这似乎会贯穿始终,列出每个匹配的目录,并且(我推测)会为每个目录和子目录创建单独的 tarball,这不会是 -bueno-。

我认为我需要调整这一行:

datedBackups=($(find -d /opt/backup/site/ -mtime +$numDaysForCompression));

但我并不完全确定,也不相信这是完全优化的。欢迎帮助!

最佳答案

您可以使用 -maxdepth 参数限制 find 向下递归的深度。

也就是说,如果您根本不需要递归,那么您可以完全避免 find 并使用 glob 并使用 stat/etc。 (对于时间的东西)直接在循环中。

类似于:

for iBD in /opt/backup/sute/*; do
    mod=$(stat -c %Y)
    # Check "$mod" against current time and your threshold ...
done 

关于bash - 如何在 shell 脚本中压缩旧目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33923168/

相关文章:

bash - 如何在 bash 字符串切碎中切碎字符串的最后 n 个字节?

bash - 按字段对文件内容进行数字排序

linux - 数字数组之间有两个额外的空间

java - 通过命令行自动将 Java (Android) 项目导入 Eclipse 工作区

unix - 从目录中的所有文件名中删除下划线

bash - 使用 sed 将引号插入管道分隔线

linux - 如何使用 bash 将文件中每一行的前 2 个字母添加到列表中?

java - 如何杀死从 CentOS 目录运行的进程?

linux - 从 Bash 脚本执行 GREP/CUT 命令时出现问题

bash - 如何在 .tmux.conf 中编写 if 语句来为不同的 tmux 版本设置不同的选项?