2012-02-24 3 views
0

로그 파일을 하루에 두 번 생성해야하는 문제가 있습니다. 두 번째 파일을 만들려고 할 때 이름이 이미있는 파일이 이미 있으므로 검색되지 않습니다. 그러므로 내가 원하는 것은 두 번째 실행이 발생했을 때입니다. 첫 번째 로그의 이름을 타임 스탬프로 지정하고 "Previous"를 나타내는 문자열로 바꾸고 싶습니다. 이 그러나 않습니다 매번 그것을 실행 무엇타임 스탬프와 문자열로 로그 이름 바꾸기

renameLogs() { 

for x in $MY_FILE_PATH/logs/!Previous*$TIMESTAMP.log; do 
mv "$x" "$Previous{x%*.log}$(TIMESTAMP).log"; 
done 

}

, 그것은 모든 로그의 이름을 바꾸고 난

같은 로그 이름으로 끝낼 :

내가 기압이 무엇

내가 간체 무엇 MyLog_240220120224-15434620120224-160148.log

원하는 경우 :

IF 로그에 이전 AND TIMESTAMP가 포함되어 있지 않은지 확인한 다음 PREVIOUS + TIMESTAMP로 로그 이름을 바꿉니다. 내 지식이 제한, 할 수있는 누군가가 도와주세요.

감사

+0

배포판의 [logrotate] (https://iain.cx/src/logrotate/)를 확인하십시오. –

답변

0

쉬운 솔루션은 cmd를이 $MY_FILE_PATH/archive_logs/

mv "$x" $MY_FILE_PATH/archive_logs/"${x%*.log}$(date +%Y%m%d-%H%M%S).log" 

가되도록 당신을 위해 의미가 이름을 선택, 그냥 예를되고, 명명 된 로그를 아카이브 디렉토리를 유지하는 것입니다 . ELSE

루프에 대한이 일치하지 않는, 그래서 당신은 몇 가지 다른 트릭을 사용할 수 있습니다 당신은 로그 파일을 ELSE

을 .LOG하는 .LOG의 이름을 변경

mv "$x" "${x%*.log}$(date +%Y%m%d-%H%M%S).LOG" 

공지 사항 개명 파일을 처리에서 제외해야합니다.

renameLogs() { 
    for x in $MY_FILE_PATH/logs/*.log; do 
     case "${x}" in 
     *2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]*) 
      : # if_File_has_YYYYMMDD_value_embedded_skip_this_file 
     ;; 
     *) 
      mv "$x" "${x%*.log}$(date +%Y%m%d-%H%M%S).log" 
     ;; 
     esac 
    done 
} 

또는

흠 ... 포맷팅이 작동을 멈췄습니다! ; -/

renameLogs() { for x $ MY_FILE_PATH/logs/.log; do [[[! "$ {x}"~ = * 2 [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [0-9] *]]; 다음 mv "$ x" "$ {x % .log} $ (날짜 + % Y % m % d- % H % M % S) .log"; fi; 완료; }

테스트되지 않음.

정규식이 사용되었습니다.

정규 표현식은 명령 줄 사용에서 익숙한 와일드 카드 아이디어 (예 : ls *.txt)의 확장으로, .exe, .bash 및 .bash로 끝나는 파일을 제외하고 txt로 끝나는 파일로 확장됩니다. .txt2 등

귀하의 경우, 지정된 형식의 날짜 (타임 스탬프 제외)와 일치하는 reg 표현식입니다. * = 임의의 문자, 단일 문자는 모두 자신과 일치하고 reg-ex의 마지막 비트는 magic is는 char 범위이며,이 경우 '[0-9]'와 simliar입니다.

~= 연산자는 정규식을 사용하여 LeftHand와 RightHand를 비교합니다. REG-expr이 $ {X}의 최종 값을 일치하도록 ${x} 일치

* any chars, 
follow by '2', 
followed by any number [0-9] (3 times) (a year value) 
followed by [0-1][0-9] (a month value) 
followed by [0-3][0-9] (a day value) 
* any chars, 

그래서 당신은 쉽게 즉, 올바른 위치에 이전 단어를 포함하는

if [[ "${x}" ~= *Previous*2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]* ]] ; then ... 
*2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]*을 확장 할 수있는 경우

은 참조

도움이 되었기를 바랍니다.

+0

답변 해 주셔서 감사합니다. IF (로그 이름에 Previous & TIMESTAMP가 포함되어 있지 않음)와 같은 유닉스 지원 기능을 사용하지 마십시오. 로그 이름을 –

+0

으로 변경하십시오. 1. 게시 한 예제 데이터에서 Previous라는 단어가 표시되지 않으므로이를 처리하는 방법을 알지 못했습니다. 2. 그렇습니다. 그러나 'case'는 동일한 기능을 (귀하의 목적에 따라) 제공합니다. 나는''$ {x} ''~ = * 2 [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [ 0-9] *]]; 그때 ... 절대하지 않으면. 행운을 빕니다. – shellter

+0

나는 예전에 예를 들었지만 나는 초기의 질문에 그것을 적어 놓았다. * 2 [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [0-9] *]]를 명확히 해 주시겠습니까? 방법? 감사합니다. –

관련 문제