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....

それらすべてを1つのファイルにマージして、コンテンツを日付順に並べ替えたいと思います。

だから私はこのようなものを思いついた:

for %f in (*.log) do type “%f” >> mergedlogs.txt

ただし、日付順(asc)のmergedlogs.txtファイルには追加されません。標準のシェル/PowerShellスクリプトを使用してそれをどのように達成できますか?これを解決するために小さな.exeを作成する必要がないようにしたいと思っていました(実際には、シェルスクリプトでこれを実行しようとする代わりに、多くの時間を節約できたと思います)。

1つのアプローチは、マージ構文に順序を実行させることですが、ファイルの名前を別のパターンに変更する必要がありますLog_yyyy_MM_dd.log

ワイルドカードによる複数の名前変更を行うためのシェルスクリプトを取得できないようです

dir * ?.logおよびdir * _ ?. logは、名前を変更する必要のあるすべてのファイル名を提供するはずですが、この構文では、目的の結果が得られません。

ren *_?.log *_0?.log

これは、望ましい名前変更の結果になります:Log_2010_12_1.log >> Log_2010_12_01.log

シェルの名前変更スクリプト(またはPowerShell)のヘルプ、またはコンテンツがファイル名-日付順に並べられている単一のファイルにすべてのログファイルをマージすることである主な目標を達成するための別のアプローチがあれば幸いです。

4

1 に答える 1

2

これは、ログを繰り返し、解析された日付にそれらを配置し、1つにマージするスクリプトです。

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 に答える