【问题标题】:plus 1 to filename文件名加 1
【发布时间】:2019-08-01 21:58:25
【问题描述】:

我的任务是日志轮换,我找不到任何可以从文件名中获取数字为 1 的命令。

例如,我有一些文件名为:wrapper.log.1wrapper.log.2。 我需要重命名该文件并将其移动到其他目录并获取wrapper_1.logwrapper_2.log。文件移动后,应从源目录中删除。

有可能,在新文件夹中有同名的文件。 所以,我应该得到最后一个文件,并将其文件名加 1,如wrapper_(2+1).log

在我的整个任务中,我发现了类似的东西

find . -name "wrapper.log.*"
mkdir $(date '+ %d.%m.%y')
find . -name "wrapper.log.*" |sort -r |head -n1 | sed -E 's/(.log)(.[0-9])/_$(2+1)\1/'

但是,当然,它在第二行之后就不起作用了。

而且,将来它需要在 bash 中。

P.S:另外,我认为,可以在新文件夹中创建带有时间戳或类似后缀的新文件。 例如:

folder        file
01.01.19    wrapper_00_00_01
            wrapper_00_01_07
            wrapper_01_10_53
            wrapper_13_07_11

02.01.19
            wrapper_01_00_01
            wrapper_03_01_07
            wrapper_05_10_53
            wrapper_13_07_11

【问题讨论】:

  • 如果您要创建一个新目录以将日志文件放入其中,为什么还要担心名称与以前存在的文件冲突?
  • 因为文件夹可能包含我应该复制的确切名称的文件。我的意思是,新文件夹每天创建一次,但日志文件从 ....log.1 到 ....log.10 范围内的原始文件夹轮换。所以,如果我只是将文件复制到新文件夹中,经过一段时间后,wrapper.log.1 会擦除名为 wrapper_1.log 的新文件夹中的文件,但它应该是 wrapper_11.log
  • 要么您正在创建一个新目录 -- mkdir $(date '+ %d.%m.%y'),要么您正在将文件复制到一个已经存在的目录中。是哪个?
  • 我需要在每天 00:00 左右创建一个新文件夹
  • 只是出于好奇:为什么要重新发明轮子并编写自己的日志轮换,而不是使用大多数 linux 系统上应该存在的 logrotate (github.com/logrotate/logrotate)?

标签: bash sed mv


【解决方案1】:

最后,我找到了两个解决方案。 首先,它的bash,像这样的smth

#!/bin/bash

#DECLARE

FILENAME=$1
DATE=$(date '+%d.%m.%y')
SRC_DIR="/usr/local/apache-servicemix-6.1.0/data/log"
DEST_DIR="/mnt/smxlog/$HOSTNAME"

#START

mkdir -m 777 "$DEST_DIR/$DATE"

if [ -d "$DEST_DIR/$DATE" ]
then

for f in $(find "$SRC_DIR/" -name "$FILENAME.log.*") 

do

TIME=$(date '+%H_%M_%S.%3N')
NEW_FILENAME="$FILENAME-$TIME.log"
NEW_DEST_WITH_FILE="$DEST_DIR/$DATE/$NEW_FILENAME"

mv $f $NEW_DEST_WITH_FILE
gzip "$NEW_DEST_WITH_FILE"

done

else 
exit 1
fi

#END

第二个变种是使用 log4j 记录器属性,但它应该上传到 servicemix 系统文件夹 log4j-1.2.17_fragment.jar 和 apache-log4j-extras-1.2.17_fragment。也许可以将它们作为捆绑上传,我没有尝试。 两个 jar 都使用不同的 API。有 https://logging.apache.org/log4j/1.2/apidocs/index.html?overview-summary.htmlhttp://logging.apache.org/log4j/companions/apidocs/index.html?overview-summary.html 属性将是

log4j.logger.wrapper.log=DEBUG, wrapper
log4j.additivity.logger.wrapper.log=false
log4j.appender.wrapper=org.apache.log4j.rolling.RollingFileAppender  
log4j.appender.wrapper.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy  
#This setting should be used with commented line log4j.appender.wrapper.File=... if it needs to zip to target directory immediately
#log4j.appender.wrapper.rollingPolicy.FileNamePattern=/mnt/smxlog/${env:HOSTNAME}/wrapper.%d{HH:mm:ss}.log.gz
#Or it is possible to log and zip in the same folder, and after that with cron replace zipped files to required folder 
log4j.appender.wrapper.rollingPolicy.FileNamePattern=${karaf.data}/log/wrapper.%d{HH:mm:ss}.log.gz
log4j.appender.wrapper.File=${karaf.data}/log/wrapper.log
log4j.appender.wrapper.triggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy  
#Size in bytes
log4j.appender.wrapper.triggeringPolicy.MaxFileSize=1000000
log4j.appender.wrapper.layout=org.apache.log4j.PatternLayout  
log4j.appender.wrapper.layout.ConversionPattern=%d{dd-MM-yyyy_HH:mm:ss} %-5p [%t] - %m%n
log4j.appender.wrapper.Threshold=DEBUG
log4j.appender.wrapper.append=true

【讨论】:

    【解决方案2】:

    要查找最大数量的 wrapper_ 日志文件:

    find . -type f -name "*.log" -exec basename {} \; | ggrep -Po '(?<=wrapper_)[0-9]' | sort -rn | head -n 1

    我正在使用 grep 的珍珠开关对“wrapper_”进行后视,然后对找到的数字进行反向排序并取第一个。如果你想生成一个新的文件名,我会使用awk,例如:

    find . -type f -name "*.log" -exec basename {} \; | ggrep -Po '(?<=wrapper_)[0-9]' | sort -rn | head -n 1 | awk '{print "wrapper_"$1 + 1".log" }'

    这将生成一个文件名,其中包含序列中的下一个数字。

    【讨论】:

    • 谢谢。接近真相。但是我将您的行稍微更改为 ---- find 。 -type f -name "wrapper*" |grep -Po '[0-9]{1,3}' |sort -rn |head -n1 |awk '{print "servicemix_"$1+1".log"}' ---
    • 我不明白,你的代码行中的 '(?
    • @Dred 这是一个正则表达式lookahead
    • (?!pattern) ==> 一个零宽度的负前瞻断言。 (?<=pattern) ==> 一个零宽度的正向后视断言。
    【解决方案3】:

    我不完全理解您的问题,但我知道使用美元符号和双括号可以执行计算:

    Prompt>echo $((1+1))
    2
    

    【讨论】:

    • 但我无法将第一个数字加 1,以获取新文件名的新数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多