Unix 使用时间戳和字符串重命名日志

Unix 使用时间戳和字符串重命名日志,unix,unix-timestamp,Unix,Unix Timestamp,我有一个问题,日志文件应该每天创建两次。当第二次创建它们时,会检测到具有该名称的文件已存在,因此不会创建它们。因此,我想做的是,当第二次运行发生时,我想用一个时间戳和一个表示“Previous”的字符串重命名第一个日志 这就是我的atm机: } 然而,它每次运行时都会重命名所有日志,最后我得到的日志名如下 MyLog_240220120224-15434620120224-160148.log 我只想做的是: 要检查日志是否不包含Previous和TIMESTAMP,请使用Previous+TI

我有一个问题,日志文件应该每天创建两次。当第二次创建它们时,会检测到具有该名称的文件已存在,因此不会创建它们。因此,我想做的是,当第二次运行发生时,我想用一个时间戳和一个表示“Previous”的字符串重命名第一个日志

这就是我的atm机:

}

然而,它每次运行时都会重命名所有日志,最后我得到的日志名如下

MyLog_240220120224-15434620120224-160148.log

我只想做的是:

要检查日志是否不包含Previous和TIMESTAMP,请使用Previous+TIMESTAMP重命名日志。我做这件事的知识有限,请有人帮忙


感谢

简单的解决方案是为命名日志保留一个归档目录,这样您的cmd就变成了

mv "$x" $MY_FILE_PATH/archive_logs/"${x%*.log}$(date +%Y%m%d-%H%M%S).log"
$MY\u FILE\u PATH/archive\u logs/
为例,选择一个对您有意义的名称

否则

您可以使用其他一些技巧,使for循环与重命名的日志文件不匹配

 mv "$x" "${x%*.log}$(date +%Y%m%d-%H%M%S).LOG"
请注意将.log重命名为.log

否则

您必须从处理中排除这些文件

renameLogs() {
   for x in $MY_FILE_PATH/logs/*.log; do
      case "${x}" in
        *2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]* ) 
           : # if_File_has_YYYYMMDD_value_embedded_skip_this_file
        ;;
        * ) 
          mv "$x" "${x%*.log}$(date +%Y%m%d-%H%M%S).log"
        ;;
      esac
   done
}

嗯。。。重新格式化已停止工作-/

重命名日志(){ 对于$MY_FILE_PATH/logs/.log;中的x 如果[!“${x}”~=*2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]*];则 mv“$x”“${x%.log}$(日期+%Y%m%d-%H%m%S).log”; fi; 完成; }

未经测试

使用正则表达式

正则表达式是通配符思想的扩展,您可能熟悉使用命令行,即
ls*.txt
,它将只扩展到以txt结尾的文件,不包括以.exe、.bash、.txt2等结尾的文件

对于您的情况,
*2[…]*
是一个reg表达式,它以您指定的格式匹配日期(不包括时间戳)。*=任何字符,单个字符只匹配它们自己,reg ex magic的最后一位是字符范围,在本例中为“[0-9]”和simliar

~=
操作符说使用正则表达式比较左手和右手

查看
${x}
是否匹配

 * any chars, 
 follow by '2', 
 followed by any number [0-9] (3 times) (a year value)
 followed by [0-1][0-9] ( a month value)
 followed by [0-3][0-9] ( a day value)
 * any chars, 
因此,您可以轻松地扩展
*2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]*
将单词previous包含在正确的位置,以便reg expr与您的最终值${x}匹配,即

 if [[ "${x}" ~= *Previous*2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]* ]] ; then ...

我希望这能有所帮助。

谢谢你的回答。如果unix不支持IF(日志名不包含Previous和TIMESTAMP)之类的函数,请重命名日志1。我在你发布的示例数据中没有看到单词Previous,所以我不知道如何处理它。2.是的,但是
case
提供了(出于您的目的)相同的功能。我尽量不使用
if[[“${x}”~=*2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]*];然后…
除非我必须这么做。祝你好运。我知道前面的内容不在我发布的示例中,但在我最初的问题中,我确实提到过,我想将其合并。请澄清什么是2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]];方法谢谢,我猜不出你说的上一句是什么意思。如果我基于非样本数据以一种方式回答,请编辑您的帖子,包括样本输入和预期输出。我将在2[0-9]….上的解释中进行编辑,该解释称为正则表达式。已编辑。不确定syntaxt是否正确,但这就是我希望它做的。非常感谢您应该查看[logrotate]()以获取您的分发。
 if [[ "${x}" ~= *Previous*2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]* ]] ; then ...