需要从bash脚本专家的帮助下创建脚本。
我的要求-需要找到源位置(以下提到的位置)的所有日志超过3天,然后将所有日志移动到另一个位置并存档,如上一个示例中的.zip文件所示。我还计划每晚将此脚本作为cron作业运行。
日志源位置示例- /tmp/logs/source/2018/09/15/server1_logs
归档后的压缩文件在destination - /tmp/logs/destination/2018_09_15.zip中应该是这样的
#!/bin/bash
LOG_SOURCE="/tmp/logs/source"
LOG_DESTINATION="/tmp/logs/destination"
ARCHIVE_AFTER="3"
archiveDay=$(date "+%d" -d "$ARCHIVE_AFTER days ago")
archiveMonth=$(date "+%m" -d "$ARCHIVE_AFTER days ago")
archiveYear=$(date "+%Y" -d "$ARCHIVE_AFTER days ago")
logArchiveSrcDirectory=$LOG_SOURCE"/"$archiveYear"/"$archiveMonth"/"$archiveDay
logArchiveDstZipFile=$LOG_DESTINATION"/"$archiveYear"_"$archiveMonth"_"$archiveDay".zip"
echo $logArchiveSrcDirectory
echo $logArchiveDstZipFile
# Log Archive Process
zip -r $logArchiveDstZipFile $logArchiveSrcDirectory
# Delete original log directory if archiving successfull
if [ -f "$logArchiveDstZipFile" ]
then
rm -r $logArchiveSrcDirectory
fi
这个脚本工作了,但它唯一的移动和压缩只有3天前的一天,但其他旧目录的其余部分仍然存在。
发布于 2018-09-18 13:31:28
我们可以连接bash的许多命令和功能来开发解决方案。以下是我的版本:
#!/bin/bash
LOG_SOURCE="/tmp/logs/source"
LOG_DESTINATION="/tmp/logs/destination"
ARCHIVE_AFTER="3"
# That directory probably exists already but let us say it doesn't
mkdir -p "$LOG_DESTINATION"
find "$LOG_SOURCE" -type d -regextype gnu-awk -regex "$LOG_SOURCE/[[:digit:]]{4}/[[:digit:]]{2}/[[:digit:]]{2}" \
| sed -r -n 's#^.*([0-9]{4})/([0-1][0-9])/([0-3][0-9])$#\1 \2 \3#p' \
| while read Y M D; do
if [[ "$Y$M$D" < $(date "+%Y%m%d" -d "$ARCHIVE_AFTER days ago") ]]
then
logArchiveSrcDirectory="$LOG_SOURCE/$Y/$M/$D"
logArchiveDstZipFile="$LOG_DESTINATION/"$Y"_"$M"_"$D".zip"
echo $logArchiveSrcDirectory
echo $logArchiveDstZipFile
if zip -r "$logArchiveDstZipFile" "$logArchiveSrcDirectory"
then
rm -r "$logArchiveSrcDirectory"
fi
fi
done
让我们来看看我做了什么:
find
将打印符合我们条件的文件:"$LOG_SOURCE"
:,这是搜索开始的目录。它将从directory-type d
:递归搜索我们仅查找directories-regextype gnu-awk
:下一个正则表达式选项将使用GNU awk-regex "$LOG_SOURCE/[[:digit:]]{4}/[[:digit:]]{2}/[[:digit:]]{2}"
:方言我们查找以源目录开头的路径,后跟由slashes分隔的四位、两位和两位数字
我们将从
sed
中。我们使用年、月和日来转换-r
:中的每一行。我们将对此step-n
:使用扩展正则表达式。我们不想显示与我们正在搜索的内容不匹配的行。我们将年、月和日组件从每行中分离出来。我们用space分隔每个元素
while read Y M D; do
读取sed
输出的每一行,并分别设置变量$Y
、$M
和$D
。我们按字典顺序比较正在处理的当前日期和3天前date
的输出,格式类似。如果该日期早于(在引用之前),我们执行一些操作:如果所有内容都是okay,则删除目录。如果所有内容都是,则删除目录。如果所有内容都是errors
rm -r "$logArchiveSrcDirectory"
:,则删除目录。如果所有内容都是okay,则删除
我有点累了,所以我不知道有没有错误。但这对我来说似乎很管用。这就是你要找的吗
发布于 2018-09-17 00:47:09
这就是为什么:
logArchiveSrcDirectory=$LOG_SOURCE"/"$archiveYear"/"$archiveMonth"/"$archiveDay
您可以使用$archiveDay
定义您的源文件。今天,$archiveDay
就是13
。
所以你是说用zip来做这件事:
zip -r /tmp/logs/destination/2018_09_132.zip /tmp/logs/source/2018/09/13
因此,它将只压缩.../13
目录中的文件。
现在,如果您想要查找超过3天的所有文件,您可以使用:
find <SOURCE DIRECTORY> -type f -mtime +3 -print
小心,这将递归地查找所有子目录中的文件。
https://stackoverflow.com/questions/52352257
复制相似问题