/root/test/access.log.1
to 999
와 to 에 /root/test/error.log.1
파일이 있습니다 999
.
와 같은 방법 으로 access.log.1
으로 이름을 바꾸고 access.log.2
으로 이동하고 싶습니다 ./var/log/archives/
error.log.1
error.log.2
나는 다음과 같은 것을 시도했다
#!/bin/bash
NEWFILE=`ls -ltr |grep error |tail -2 | head -1 |awk '{print $9}'`
for i in `ls -ltr |grep error |tail -1`;
do
mv "$i" /var/log/archives/"$NEWFILE"
done
답변1
간단한 bash
스크립트:
for file in {access,error}.log.{999..1}; do
echo "$file" "/path/to/dest/${file//[0-9]}$((${file//[a-z.]}+1))";
done
${file//[0-9]}
error.log.
, 숫자를 제거하고 또는 부분을 생성하는 문자만 유지합니다access.log.
.${file//[a-z.]}
, 문자와 점만 제거합니다(파일 이름 패턴 때문에 썼습니다a-z.
). 그러면 숫자 부분이 생성됩니다.$((${file//[a-z.]}+1))
위에서 생성된 숫자에 1을 추가합니다.
그러면 파일 이름이 다음과 같이 바뀌고 다음 위치로 이동됩니다 /path/to/dest/
.
access.log.999 --> /path/to/dest/access.log.1000
access.log.998 --> /path/to/dest/access.log.999
...
error.log.999 --> /path/to/dest/error.log.1000
error.log.998 --> /path/to/dest/error.log.999
...
echo
mv
파일 이름을 바꾸면 연습 실행이 대체됩니다 .
답변2
우리는 다음과 같이 뭔가를 실행할 수 있습니다
perl -E 'for (reverse 1..999){
rename( "access.log.$_" , "access.log.".($_+1))}'
답변3
#! /usr/bin/env bash
# exit on error
set -e
# increase the numbers of the old archives (mv -i avoids accidental overwrite)
for ((i=999; i >= 2; i--)); do
for name in access error; do
if [[ -e /var/log/archives/$name.log.$i ]]; then
mv -i "/var/log/archives/$name.log.$i" "/var/log/archives/$name.log.$((i+1))"
fi
done
done
# move current files to archives
for name in access error; do
mv -i "/root/test/$name.log.1" "/var/log/archives/$name.log.2"
done