Bash/DOS/PowerShell脚本列出最新版本的文件?

ili*_*rit 5 bash shell powershell dos

我们有一个(比方说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
Run Code Online (Sandbox Code Playgroud)

这将以递归方式列出所有带有*.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
Run Code Online (Sandbox Code Playgroud)

我现在显然需要做的是删除不是最新版本的文件,以便输出看起来像这样(不太担心格式化):

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
Run Code Online (Sandbox Code Playgroud)

有人有主意吗?

[编辑]这个问题的一些好主意和答案.不幸的是,我无法将所有标记都接受,但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]++'
Run Code Online (Sandbox Code Playgroud)

电源外壳:

  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
Run Code Online (Sandbox Code Playgroud)

EBG*_*een 8

ls -r -fi *.lis | sort @{expression={$_.Name}}, @{expression={$_.LastWriteTime};Descending=$true} | select Directory, Name, lastwritetime | Group-Object Name | %{$_.Group | Select -first 1}
Run Code Online (Sandbox Code Playgroud)