1

我有几个由以下模式命名的日志文件 Log_yyyy_M_d.log

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) 排序的 mergelogs.txt 文件中。我怎样才能使用标准的 shell/powershell 脚本来完成呢?我希望避免创建一个小的 .exe 来解决这个问题(实际上我想这会节省我很多时间,而不是尝试在 shell 脚本中执行此操作)。

一种方法是让合并语法按顺序排列,但随后我必须将文件重命名为另一种模式 Log_yyyy_MM_dd.log

似乎无法让 shell 脚本通过通配符进行多次重命名

目录 * ? ?.log 和 dir *_?.log 应该给我所有我需要重命名的文件名,但是这种语法并没有给我想要的结果

ren *_?.log *_0?.log

这将是所需的重命名结果:Log_2010_12_1.log >> Log_2010_12_01.log

任何有关 shell 重命名脚本(或 powershell)的帮助将不胜感激,或者可能是另一种实现主要目标的方法,即将所有日志文件合并到一个文件中,其中内容按文件名-日期排序。

4

1 回答 1

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
于 2012-08-01T07:29:11.347 回答