2012-02-24 56 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

What I simp我想要做的是:

檢查IF日誌不包含以前的AND TIMESTAMP然後用PREVIOUS + TIMESTAMP重命名日誌。我的知識做到這一點有限,可有人請幫忙。

感謝

+0

您應該查看[logrotate](https://iain.cx/src/logrotate/)您的發行版。 – 2012-02-24 17:38:55

回答

0

最簡單的解決辦法是保持一個文件目錄爲您命名日誌,所以你的CMD變得

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

$MY_FILE_PATH/archive_logs/只是作爲一個例子,選擇一個名字,讓你感覺。

ELSE

你可以使用一些其他的技巧,因此for循環不匹配,重命名日誌文件

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

通知更名.LOG到.LOG

ELSE

您必須排除加工文件

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 
} 

嗯...重新格式化已停止工作! ; -/

爲$ MY_FILE_PATH/logs/.log中的x重命名日誌(){ ;做[ ] if [[! 「$ {x}」〜= * 2 [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [0-9] *]];然後 mv「$ x」「$ {x% .log} $(date +%y%m%d-%H%M%S).log」; fi; fi; 完成; }

未經測試。

使用正則表達式

正則表達式是對使用命令行(即ls *.txt)可能熟悉的通配符思想的擴展,即ls *.txt將擴展爲僅以txt結尾的文件,不包括以.exe,.bash結尾的文件, .txt2等

對於您的情況,*2[...]*是一個reg表達式,它與您指定的格式中的日期(不包括時間戳)相匹配。* =任何字符,單個字符與自己匹配,並且reg-ex的最後一位魔法是字符範圍,在這種情況下是'[0-9]'和simliar。

~=運算符說比較LeftHand和RightHand使用正則表達式。

看看${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]*包含在正確的位置前面的字,因此REG-EXPR符合您的$ {X}終值,即

if [[ "${x}" ~= *Previous*2[0-9][0-9][0-9][0-1][0-9][0-3][0-9]* ]] ; then ... 

我希望這有助於。

+0

感謝您的回答。沒有unix支持函數,如IF(日誌名稱不包含Previous&TIMESTAMP),重命名日誌 – 2012-02-24 17:24:36

+0

1.我沒有在您發佈的示例數據中看到Previous一詞,所以我不知道如何處理它。 2.是的,但'case'提供(爲了您的目的)相同的功能。我嘗試不使用if [[「$ {x}」〜= * 2 [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [ 0-9] *]];那麼......「除非我絕對必須。祝你好運。 – shellter 2012-02-24 17:28:28

+0

我知道以前沒有在我發佈的例子中,但它在我剛纔提到的我最初的問題中,我想合併它。請您澄清一下* 2 [0-9] [0-9] [0-9] [0-1] [0-9] [0-3] [0-9] *]];手段?謝謝 – 2012-02-24 17:52:00

相關問題