Сzsh
:
#! /bin/zsh -
autoload zmv
incr='++count[$1]'
typeset -A count
zmv -n '(**/)(*)(.txt)' '$1$((incr))$3'
(удалить -n
когда счастлив)
Идея состоит в том, чтобы использовать ассоциативные массивы, ключ которых является каталогом для подсчета.
Нам нужна промежуточная переменная incr
, иначе она не будет работать для имен каталогов, содержащих ]
.
Как только процесс открывает файл, вы можете делать с этим файлом все, что угодно, например, переименовывать его, усекать и даже удалять, но процесс все равно будет открывать этот файл. Распространенной ошибкой является то, что когда файл журнала израсходовал все дисковое пространство, его удаляют, пытаясь освободить место. Однако процесс записи в файл журнала все еще открыт, поэтому место не освобождается. Только когда процесс закроет файл, блоки, выделенные для файла, будут освобождены. (Обходным путем здесь является усечение файла, т. е. > logfile
.)
В вашем случае вы переименовали файл, но процесс записи в него не знает и не заботится об этом.
У утилиты logcheck
есть опция copytruncate
для таких ситуаций :она копирует лог-файл в повернутое имя, а затем усекает оригинал. Вы можете сделать то же самое:
rotateLog() {
currentsize=$(du -k $LOGFILE | cut -f1)
if [ $currentsize -ge $MAX_LOGFILE_SIZE ]; then
ROTATEDLOG=$LOGFILE.$(date +%Y%m%d%H%M%S)
cp -p $LOGFILE $ROTATEDLOG && true > $LOGFILE
fi
}
Лучшей альтернативой было бы изменить процесс, чтобы понять, например.сигнал SIGHUP, чтобы закрыть и снова открыть файл журнала. См. команду оболочки trap
для обработки этого.
Основываясь на альтернативном решении, предложенном @wurtel, я заработал так:
#!/bin/bash
LOGFILE="/root/logr/simple.log"
function sighuphandler() {
exec > >(tee "$LOGFILE") 2>&1
}
trap sighuphandler SIGHUP
LOGPATH="/root/logr"
MAX_LOGFILE_SIZE=5
rotateLog() {
currentsize=$(du -k $LOGFILE | cut -f1)
if [ $currentsize -ge $MAX_LOGFILE_SIZE ]; then
savelog -dn $LOGFILE &>/dev/null
kill -s SIGHUP $$
fi
}
sighuphandler
while :; do
echo "[`date "+%Y-%m-%d %H:%M:%S"`] [INFO] - A computer program can easily produce gibberish - especially if it has been provided with garbage beforehand. This program does something a little different. It takes a block of text as input and works out the proportion of characters within the text according to a chosen order. For example, an order of 2 means the program looks at pairs of letters, an order of 3 means triplets of letters and so on. The software can regurgitate random text that is controlled by the proportion of characters. The results can be quite surprising."
ls +
rotateLog
sleep 5
done