증분 번호로 파일 이름 바꾸기

증분 번호로 파일 이름 바꾸기

/root/test/access.log.1to 999와 to 에 /root/test/error.log.1파일이 있습니다 999.

와 같은 방법 으로 access.log.1으로 이름을 바꾸고 access.log.2으로 이동하고 싶습니다 ./var/log/archives/error.log.1error.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
...

echomv파일 이름을 바꾸면 연습 실행이 대체됩니다 .

답변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

관련 정보