如何压缩shell脚本中的旧目录?

时间:2015-11-25 17:45:15

标签: bash shell scripting directory tar

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

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

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

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。

这是我一直在尝试的,但循环似乎贯穿子目录,我只希望脚本可以看到一个深度级别。

logThis是一个自定义日志记录功能,它只是以预定格式将消息记录到已配置的文件中。

为了简化测试,我们将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));

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

1 个答案:

答案 0 :(得分:2)

您可以使用find参数限制-maxdepth递减的距离。

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

类似的东西:

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