shell脚本每天创建带有时间戳的文件夹并推送时间戳生成的日志

Posted

技术标签:

【中文标题】shell脚本每天创建带有时间戳的文件夹并推送时间戳生成的日志【英文标题】:shell script to create folder daily with time-stamp and push time-stamp generated logs 【发布时间】:2013-01-31 10:08:13 【问题描述】:

我有一个 cron 作业,它每 30 分钟运行一次,以生成带有如下时间戳的日志文件:

test20130215100531.log, 
test20130215102031.log  

我想每天创建一个带有日期时间戳的文件夹,并在生成时将日志文件推送到相应的日期文件夹中。

我需要在 AIX 服务器上使用 bash 来实现这一点。

【问题讨论】:

每天晚上 00 点创建目录的 cronjob 怎么样?然后修改实际的cronjob将文件推送到这个目录。 我会推荐 mkdir -p 每次创建丢失的目录而不抱怨它是否已经存在。如果 00:00 作业由于某种原因无法运行(系统停机),我们是否希望所有日常作业都因此而失败? 是的,你是对的。我更喜欢你的选择。 感谢您的建议。我不会在 cronjob 中配置上述要求。我有一个创建日志文件的 shell 脚本。我需要编写一些脚本来拥有该目录并将生成的日志推送到该目录 好的。到目前为止,您编写了什么代码? 【参考方案1】:

也许您正在寻找这样的脚本:

#!/bin/bash

shopt -s nullglob  # This line is so that it does not complain when no logfiles are found
for filename in test*.log; do # Files considered are the ones starting with test and ending in .log
    foldername=$(echo "$filename" | awk 'print (substr($0, 5, 8));'); # The foldername is characters 5 to 13 from the filename (if they exist)
    mkdir -p "$foldername"  # -p so that we don't get "folder exists" warning
    mv "$filename" "$foldername"
    echo "$filename $foldername" ;
done

我只用你的样本进行了测试,所以在使用包含重要内容的目录之前进行适当的测试。

编辑以响应 cmets:

将您的原始脚本更改为:

foldername=$(date +%Y%m%d)
mkdir -p  /home/app/logs/"$foldername"
sh sample.sh > /home/app/logs/"$foldername"/test$(date +%Y%m%d%H%M%S).log

或者如果目录是在其他地方创建的,只需这样做:

sh sample.sh > /home/app/logs/$(date +%Y%m%d)/test$(date +%Y%m%d%H%M%S).log

【讨论】:

非常感谢!!如果我可以在一天开始时只创建一次目录并将同一天的日志写入目录,那会怎样。现在..我正在通过一个带有时间戳的脚本放置在一个位置来形成日志。 您能否发布脚本中创建带有时间戳的日志文件的部分?从那开始工作更容易。 (如果您编辑您的问题,请在此处发表评论,以便我收到通知) // 在这里做一些配置,然后执行另一个脚本来创建文件,如下所示。 sh sample.sh > /home/app/logs/test$(date +%Y%m%d%H%M%S).log 以上每30分钟运行一次,一天会产生48条日志 阅读我的编辑。这将创建一个文件夹名称 YYYY/MM/DD(如果它不存在),并将数据存储在那里。 非常感谢!希望某一天的文件不会与上述解决方案错位..【参考方案2】:

你应该使用 logrotate!它已经可以为您执行此操作,您只需写入同一个日志文件即可。

查看他们的手册页以获取信息: http://linuxcommand.org/man_pages/logrotate8.html

【讨论】:

以上是关于shell脚本每天创建带有时间戳的文件夹并推送时间戳生成的日志的主要内容,如果未能解决你的问题,请参考以下文章

根据另一列中的更改创建带有时间戳的最后修改列

数据库迁移脚本和带有时间戳的版本控制

Log4j 属性 |为每次运行创建带有时间戳的新日志文件[重复]

用于将日期和时间列转换为 .csv 中的 unix 时间戳的 Bash 脚本

备份系统的shell脚本[关闭]

每天一个shell命令和脚本