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

时间:2012-02-24 16:47:48

标签: unix unix-timestamp

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

这就是我的主题:

renameLogs() {

for x in $MY_FILE_PATH/logs/!Previous*$TIMESTAMP.log; do
mv "$x" "$Previous{x%*.log}$(TIMESTAMP).log";
done
     

}

然而,这是什么,每次运行时,它都会重命名所有日志,最后会有日志名称,如

MyLog_240220120224-15434620120224-160148.log

我只想做的是:

检查IF日志是否包含Previous AND TIMESTAMP,然后使用PREVIOUS + TIMESTAMP重命名日志。我这样做的知识有限,有人可以帮忙。

由于

1 个答案:

答案 0 :(得分:0)

简单的解决方案是为您的命名日志保留存档目录,以便您的cmd变为

mv "$x" $MY_FILE_PATH/archive_logs/"${x%*.log}$(date +%Y%m%d-%H%M%S).log"

$MY_FILE_PATH/archive_logs/为例,选择一个对你有用的名称。

ELSE

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

 mv "$x" "${x%*.log}$(date +%Y%m%d-%H%M%S).LOG"

注意将.log重命名为.LOG

ELSE

您必须从处理中排除文件

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
}

OR

嗯...重新格式化已停止工作! ; - /

renameLogs(){ for $ MY_FILE_PATH / logs / .log;做 如果[[! “$ {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是char范围,在这种情况下是'[0-9]'和simliar。

~=运算符表示使用正则表达式比较LeftHand与RightHand。

查看${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]*以在前面的正确位置包含单词,以便reg-expr与$ {x}的最终值匹配,即

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

我希望这会有所帮助。