【发布时间】:2016-02-28 15:16:05
【问题描述】:
作为部署过程的一部分,我在 /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 压缩到它自己的压缩包中,但前提是该目录早于可配置的 +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));
但我不完全确定,也不相信这是完全优化的。欢迎提供帮助!
【问题讨论】:
-
您可以使用
-maxdepth参数限制find递归的范围,但如果您根本不需要递归,那么您可以完全避免find并使用而是使用 glob 并使用stat/etc。对于循环中的时间内容。for iBD in /opt/backup/triplefin/*; do mod=$(stat -c %Y); ...; done -
除非你在调用这个函数之前已经设置了
dateForName和checkSum,否则这个赋值compressedFileName="backup-site-$dateForName-$checkSum.tgz";不会按照你想要的方式工作。 -
感谢@EtanReisner。我确实在具有其他功能的脚本开头设置了值。这是我唯一遇到问题的功能。
-
@EtanReisner 当我运行与您建议的测试类似的命令时,我得到以下输出。
for iBD in /opt/backup/site/*; do mod=$(stat -c %Y); echo $iBD; done尝试“stat --help”获取更多信息。 /opt/backup/triplefin/microsite-20151118 尝试“stat --help”以获取更多信息。 /opt/backup/triplefin/microsite-20151124 关于从 stat 中删除警告的任何建议,以便我只取回我需要处理的内容? -
哦,呸……那太愚蠢了。我错过了文件名。对不起。
mod=$(stat -c %Y "$iBD")
标签: bash shell scripting directory tar