有时一个报告会存在于多达5个不同的位置,我需要生成每个报告最新版本的所有位置的列表。
我可以很容易地使用代码来完成,或者将“dir”或“ls”输出重定向到文本文件中,然后在Excel中进行操作,但我更喜欢使用DOS、Bash或PowerShell中更简单(希望是一行)的解决方案。
到目前为止,在PowerShell中,我想到的最好的解决方案是:
ls -r -fi *.lis | sort @{expression={$_.Name}}, @{expression={$_.LastWriteTime};Descending=$true} | select Directory, Name, lastwritetime
这将递归列出所有扩展名为*.lis的文件,然后按名称(升序)和日期(降序)进行排序,并显示目录、名称和日期。
这将产生以下输出:
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(已编辑)的答案可以直接使用。我会在验证后将可行的解决方案添加到此处。
bash:
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]++'
PowerShell:
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