我遇到的问题是每天应该创建两次日志文件。当它们即将第二次创建时,会检测到已存在具有该名称的文件,因此不会创建它们。我想要做的是第二次运行时,我想用时间戳重命名第一个日志,也许是一个字符串“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重命名日志。我这样做的知识有限,有人可以帮忙。
由于
答案 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 ...
我希望这会有所帮助。