2012-02-24 8 views
0

ログファイルを1日に2回作成する必要があるという問題があります。 2回目に作成しようとすると、その名前のファイルが既に存在するため、作成されていないことが検出されます。したがって、2回目の実行が行われるときに、最初のログの名前をタイムスタンプで、おそらく "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

私は何をsimp次のようになります:

IFログには前のAND TIMESTAMPが含まれていないかどうかをチェックし、PREVIOUS + TIMESTAMPでログの名前を変更します。私の知識が限られているので、助けてもらえますか?簡単な解決策は、あなたのために理にかなって名前を選ぶので、あなたのcmdが$MY_FILE_PATH/archive_logs/は単なる例であると

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

になり、あなたの名前のログのアーカイブディレクトリを維持することです

おかげ

+0

配布については、[logrotate](https://iain.cx/src/logrotate/)をチェックしてください。 –

答えて

0

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 
} 

または

hm ...再フォーマットが停止しました! ; -/

renameLogs(){ for x $ MY_FILE_PATH/logs/.log内のx; [の場合は[[! "$ {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}試合

* 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, 

だから、簡単に正しい位置に前の単語が含まれるように*2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]*を拡張することができれば、{X}、すなわち

if [[ "${x}" ~= *Previous*2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]* ]] ; then ... 
を参照してください。

こちらがお役に立てば幸いです。

+0

答えをありがとう。 IF(ログ名にはPrevious&TIMESTAMPが含まれていません)などのUnixサポート機能はありません。ログの名前を変更してください。 –

+0

1.投稿したサンプルデータに「Previous」という単語は表示されません。 2.はい。ただし、 'case'は同じ目的のために同じ機能を提供します。私は '$ {x} '〜= * 2 [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [ 0-9] *]];それから...絶対にする必要がない限り。がんばろう。 – shellter

+0

私は最初の質問で私はそれを取り入れたいと言及したが、私はそれを掲載した例で前のisntを知っている。 * 2 [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [0-9] *]]を明確にしてください。手段?おかげで –

関連する問題