我们有一个列表(比如说 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