如何在 shell 脚本中压缩旧目录?
How do I compress old directories in a shell script?
作为部署过程的一部分,我在 /opt/backup/{backupDirectory} 中创建了备份目录。
因为将备份加在一起可能会占用大量 space,但由于政策需要保留,我想使用稍微不同的名称单独压缩它们。
在 /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。
这是我一直在尝试的方法,但是循环似乎 运行 通过子目录,我只希望脚本可以看到一层深度。
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
/等。 (时间的东西)直接在循环中。
类似于:
for iBD in /opt/backup/sute/*; do
mod=$(stat -c %Y)
# Check "$mod" against current time and your threshold ...
done
作为部署过程的一部分,我在 /opt/backup/{backupDirectory} 中创建了备份目录。
因为将备份加在一起可能会占用大量 space,但由于政策需要保留,我想使用稍微不同的名称单独压缩它们。
在 /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。
这是我一直在尝试的方法,但是循环似乎 运行 通过子目录,我只希望脚本可以看到一层深度。
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
/等。 (时间的东西)直接在循环中。
类似于:
for iBD in /opt/backup/sute/*; do
mod=$(stat -c %Y)
# Check "$mod" against current time and your threshold ...
done