2012-08-01 146 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