5

特定の条件に応じてさまざまなフォルダーにダンプされる (50 としましょう) レポートのリストがあります。すべてのレポートには標準的な名前が付いています。D099C.LIS、D18A0.LISなど

レポートが最大 5 つの異なる場所に存在する場合があり、各レポートの最新バージョンのすべての場所のリストを生成する必要があります。

コードを使用するか、「dir」または「ls」出力をテキスト ファイルにリダイレクトしてから Excel で操作することで簡単に実行できますが、DOS、bash、またはPowerShell。

これまでに PowerShell で思いついた最高のもの (bash を使用して同様のことを行いました) は次のとおりです。

ls -r -fi *.lis | sort @{expression={$_.Name}}, @{expression={$_.LastWriteTime};Descending=$true} | select Directory, Name, lastwritetime

これにより、拡張子が *.lis のすべてのファイルが再帰的に一覧表示され、名前 (asc) と日付 (desc) で並べ替えられ、ディレクトリ、名前、および日付が表示されます。

これにより、次のような出力が得られます。

C:\reports\LESE            D057A.LIS                  28/01/2009 09:00:43
C:\reports\JCSW            D057A.LIS                  27/01/2009 10:50:21
C:\reports\ALID            D075A.LIS                  04/02/2009 12:34:12
C:\reports\JCSW            D075B.LIS                  05/02/2009 10:07:15
C:\reports\ALID            D075B.LIS                  30/01/2009 09:14:57
C:\reports\BMA3            D081A.LIS                  01/09/2008 14:51:36

私が今やるべきことは、最新バージョンではないファイルを削除して、出力が次のようになるようにすることです (フォーマットについてはまだあまり心配していません)。

C:\reports\LESE            D057A.LIS                  28/01/2009 09:00:43
C:\reports\JCSW            D075B.LIS                  05/02/2009 10:07:15
C:\reports\BMA3            D081A.LIS                  01/09/2008 14:51:36

誰にもアイデアはありますか?

[編集] この質問に対するいくつかの良いアイデアと回答。残念ながら、すべてを承認済みとしてマークすることはできませんが、EBGreen の (編集された) 回答は変更なしで機能しました。それらを確認しながら、ここに実用的なソリューションを追加します。

バッシュ:

 ls -lR --time-style=long-iso | awk 'BEGIN{OFS="\t"}{print $5,$6,$7,$8}' | grep ".LIS" | sort -k4 -k2r -k3r | uniq -f3
 ls -lR --time-style=long-iso | awk 'BEGIN{OFS="\t"}{print $5,$6,$7,$8}' | grep ".LIS" | sort -k4 -k2r -k3r | awk '!x[$4]++'

パワーシェル:

  ls -r -fi *.lis | sort @{expression={$_.Name}}, @{expression={$_.LastWriteTime};Descending=$true} | select Directory, Name, lastwritetime | Group-Object Name | %{$_.Group | Select -first 1}
  ls -r . *.lis | sort -desc LastWriteTime | group Name | %{$_.Group[0]} | ft Directory,Name,LastWriteTime
  ls -r -fi *.lis | sort @{expression={$_.Name}}, @{expression={$_.LastWriteTime};Descending=$true} | unique | ft Directory,Name,LastWriteTime
4

8 に答える 8

8
ls -r -fi *.lis | sort @{expression={$_.Name}}, @{expression={$_.LastWriteTime};Descending=$true} | select Directory, Name, lastwritetime | Group-Object Name | %{$_.Group | Select -first 1}
于 2009-02-06T14:27:14.770 に答える
2

PowerShellのもう1つの代替手段、次のようなより「スクリプト」。

ls -r . *.lis | sort LastWriteTime | %{$f=@{}} {$f[$_.Name]=$_} {$f.Values} | ft Directory,Name,LastWriteTime
  1. ファイルを再帰的に取得する
  2. 最後の書き込み時間で昇順に並べ替えます
  3. ハッシュマップ(連想配列)を初期化する
  4. ファイルごとに、名前をキーとして使用して割り当てます。後のエントリは前のエントリを上書きします
  5. ハッシュマップの値を取得します(キーを除く)
  6. 表としてフォーマット

FileInfoオブジェクトは、パイプライン全体で保持されることに注意してください。オブジェクトの任意のプロパティ/メソッドにアクセスしたり、任意の方法でフォーマットしたりできます。

于 2009-03-05T19:28:54.977 に答える
2

bash では、回答をuniqにパイプできます。あなたの bash 1-liner の結果の正確な構造はわかりませんが、 -w N と -s N への正しい引数はそれを行うべきです。

于 2009-02-06T14:43:01.400 に答える
1

パワーシェル:

ls -r . *.lis | sort -desc LastWriteTime | sort -u Name | ft Directory,Name,LastWriteTime

説明:

  1. ファイルを再帰的に取得する
  2. ファイルを LastWriteTime で降順に並べ替えます
  3. ファイルを名前で並べ替え、一意のファイルを選択します (最初のファイルのみ)。
  4. 結果の FileInfo オブジェクトを、ディレクトリ、名前、および時刻を含むテーブルにフォーマットします

sortが安定していることに依存しない代替手段:

ls -r . *.lis | sort -desc LastWriteTime | group Name | %{$_.Group[0]} | ft Directory,Name,LastWriteTime
  1. ファイルを再帰的に取得する
  2. ファイルを LastWriteTime で降順に並べ替えます
  3. ファイルを名前でグループ化する
  4. グループごとに、グループの最初の (インデックス 0) アイテムを選択します
  5. 結果の FileInfo オブジェクトを、ディレクトリ、名前、および時刻を含むテーブルにフォーマットします
于 2009-03-04T22:06:38.957 に答える
0

ls -ARFlrt | awk '{print $6,$7,$8}'|grep 2010|sort -n

類似品を探していました。上記は、bashで求めていたリストを取得するのに役立ちました。grep はオプションです (もちろん)。\ありがとう

于 2010-07-15T00:24:11.157 に答える
-1

$f = ls -r -fi *.lis | ソート名,lastWriteTime -desc

# -whatIf を削除してファイルを削除します

$f[1..$f.長さ] | 削除-アイテム -whatIf

于 2009-02-07T16:17:39.183 に答える