我有几个日志文件,它们由以下模式命名: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)排序的mergedlogs.txt文件中。我如何使用标准shell / powershell脚本实现这一目标?我希望避免创建一个小的.exe来解决这个问题(实际上我想这会节省我很多时间而不是尝试在shell脚本中执行此操作)。
一种方法是让合并语法按顺序执行,但后来我必须将文件重命名为另一种模式Log_yyyy_MM_dd.log
似乎无法通过通配符进行多重命名的shell脚本
dir * ??。log和dir * _?。log应该给我所有需要重命名的文件名,但是这种语法没有给我所需的结果
ren *_?.log *_0?.log
这将是所需的重命名结果:Log_2010_12_1.log>> Log_2010_12_01.log
任何有关shell重命名脚本(或powershell)的帮助都会受到赞赏,或者可能是实现主要目标的另一种方法,即将所有日志文件合并到单个文件中,其中内容按文件名日期排序。 / p>
答案 0 :(得分: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