首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >归档日志的Bash脚本

归档日志的Bash脚本
EN

Stack Overflow用户
提问于 2018-09-16 16:14:33
回答 2查看 1.3K关注 0票数 -3

需要从bash脚本专家的帮助下创建脚本。

我的要求-需要找到源位置(以下提到的位置)的所有日志超过3天,然后将所有日志移动到另一个位置并存档,如上一个示例中的.zip文件所示。我还计划每晚将此脚本作为cron作业运行。

日志源位置示例- /tmp/logs/source/2018/09/15/server1_logs

归档后的压缩文件在destination - /tmp/logs/destination/2018_09_15.zip中应该是这样的

代码语言:javascript
复制
#!/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天前的一天,但其他旧目录的其余部分仍然存在。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-18 13:31:28

我们可以连接bash的许多命令和功能来开发解决方案。以下是我的版本:

代码语言:javascript
复制
#!/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

,则删除

我有点累了,所以我不知道有没有错误。但这对我来说似乎很管用。这就是你要找的吗

票数 1
EN

Stack Overflow用户

发布于 2018-09-17 00:47:09

这就是为什么:

代码语言:javascript
复制
logArchiveSrcDirectory=$LOG_SOURCE"/"$archiveYear"/"$archiveMonth"/"$archiveDay

您可以使用$archiveDay定义您的源文件。今天,$archiveDay就是13

所以你是说用zip来做这件事:

代码语言:javascript
复制
zip -r /tmp/logs/destination/2018_09_132.zip /tmp/logs/source/2018/09/13

因此,它将只压缩.../13目录中的文件。

现在,如果您想要查找超过3天的所有文件,您可以使用:

代码语言:javascript
复制
find <SOURCE DIRECTORY> -type f -mtime +3 -print

小心,这将递归地查找所有子目录中的文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52352257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档