通过通配符重命名多个文件(batch / powershell)

时间:2012-08-01 06:56:55

标签: shell powershell batch-file

我有几个日志文件,它们由以下模式命名: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>

1 个答案:

答案 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