2012-08-01 46 views
1

我有一個由以下模式命名多個日誌文件Log_yyyy_M_d.log通過通配符重命名多個文件(批處理/ PowerShell的)

Log_2010_7_1.log 
Log_2010_7_2.log 
Log_2010_7_3.log 
Log_2010_7_4.log 
Log_2010_7_5.log 
etc.... 

我想他們都合併到一個單一的文件,其中內容按日期排列。

所以我想出了這樣的事情:

for %f in (*.log) do type 「%f」 >> mergedlogs.txt 

然而,它們不會添加到按日期(ASC)下令mergedlogs.txt文件。我該如何使用標準的shell/powershell腳本來完成該操作?我希望避免必須創建一個小的.exe來解決這個問題(實際上,我想這會爲我節省大量時間,而不是在shell腳本中執行此操作)。

一種方法是有合併語法做一個訂單,但後來我不得不將文件重命名爲另一個模式Log_yyyy_MM_dd.log

似乎無法獲得shell腳本做的通配符的倍數重命名

dir * ? ? .log和DIR * _ ?.日誌應該給我,我需要重命名的所有文件名,但是這句法沒有給我想要的結果

ren *_?.log *_0?.log 

這將是希望的重命名結果:Log_2010_12_1。日誌>> Log_2010_12_01.log

任何與shell重命名腳本(或powershell)的幫助將不勝感激,或者可能是另一種方法來實現的主要目標是將所有的日誌文件合併到一個文件的內容是按文件名日期排序。

回答

2

這裏是一個腳本,在日誌迭代,安排他們在解析日期,併合併成一個:

dir Log_*.log | % { #get all logs files 
    #parse name to extract date 
    $match = [regex]::Match($_.Name, "(\d+)_(\d+)_(\d+)"); 

    #add property with extracted date in invariant culture 
    Add-Member -InputObject $_ -MemberType NoteProperty -Name ParsedDate ` 
           -Value ([DateTime]::Parse([string]::Format("{0}/{1}/{2}", ` 
              $match.Groups[1], $match.Groups[2], $match.Groups[3]), ` 
            [System.Globalization.CultureInfo]::InvariantCulture)); 

    return $_; 
} | ` 
    Sort-Object -Property ParsedDate | gc -Encoding utf8 >> merged.logs 
+0

就像一個魅力!謝謝!我可以看到,閱讀PowerShell - 用戶手冊是非常值得的:) – Kman 2012-08-01 08:31:47

+0

看起來不錯;儘管你需要解析['DateTime'](http://msdn.microsoft.com/en-us/library/system.datetime.aspx),爲什麼不直接使用['ParseExact'](http: //msdn.microsoft.com/en-us/library/w2sa9yss.aspx)?您甚至不需要處理文件名,只需使用格式:'[DateTime] :: ParseExact($ _。Name,'「Log_」yyyy_M_d「.log」',$ null)''將其轉義。 – 2012-09-08 13:32:55

+0

是的,這可能是另一種解決方案。但是您需要考慮:如何使用不變或當前文化生成文件夾名稱 – Akim 2012-09-08 16:37:06