文件名加 1
plus 1 to filename
我的任务是日志轮换,我找不到任何命令可以从文件名中找到一些数字为 1 的命令。
例如,我有一些名称为wrapper.log.1
、wrapper.log.2
的文件。
我需要重命名并将这些文件移动到其他目录并获得 wrapper_1.log
、wrapper_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)/'
当然,第二行之后就不行了
而且,将来,它需要在 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
我不完全理解你的问题,但我知道使用美元符号和双括号你可以执行计算:
Prompt>echo $((1+1))
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".log" }'
这将生成一个文件名,其中包含序列中的下一个数字。
最后,我找到了两个解决方案。
首先是bash,像这样
#!/bin/bash
#DECLARE
FILENAME=
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.html 和
http://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
我的任务是日志轮换,我找不到任何命令可以从文件名中找到一些数字为 1 的命令。
例如,我有一些名称为wrapper.log.1
、wrapper.log.2
的文件。
我需要重命名并将这些文件移动到其他目录并获得 wrapper_1.log
、wrapper_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)/'
当然,第二行之后就不行了
而且,将来,它需要在 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
我不完全理解你的问题,但我知道使用美元符号和双括号你可以执行计算:
Prompt>echo $((1+1))
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".log" }'
这将生成一个文件名,其中包含序列中的下一个数字。
最后,我找到了两个解决方案。 首先是bash,像这样
#!/bin/bash
#DECLARE
FILENAME=
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.html 和 http://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