плюс 1 к имени файла - PullRequest
       23

плюс 1 к имени файла

0 голосов
/ 11 марта 2019

Моя задача - ротация журналов, и я не могу найти команду, которая может найти какое-то число из имени файла с 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)\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

Ответы [ 3 ]

2 голосов
/ 11 марта 2019

Чтобы найти наибольшее количество файлов журнала 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" }'

Это даст имя файла со следующим номером в последовательности.

0 голосов
/ 13 марта 2019

Наконец-то я нашел два решения. Во-первых, это bash, что-то вроде этого

#!/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

И второй вариант использует свойства loggj logger, но его следует загрузить в системную папку servicemix log4j-1.2.17_fragment.jar и apache-log4j-extras-1.2.17_fragment. Может быть, их можно загрузить как связку, я не пробовал. Обе банки используют разные 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
0 голосов
/ 11 марта 2019

Я не совсем понимаю ваш вопрос, но знаю, что, используя знак доллара и двойные скобки, вы можете выполнить вычисление:

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