У нас есть список (скажем, 50) отчетов, которые сбрасываются в разные папки в зависимости от определенных условий. Все отчеты имеют стандартные имена, например. Д099К.ЛИС, Д18А0.ЛИС и т.д.
Иногда отчет может находиться в пяти разных местах, и мне нужно создать список всех местоположений самой последней версии каждого отчета.
Я могу легко сделать это, используя код или перенаправляя вывод «dir» или «ls» в текстовый файл, а затем манипулируя им в Excel, но я бы предпочел более простое (надеюсь, однострочное) решение с использованием DOS, bash, или PowerShell.
Лучшее, что я придумал до сих пор в PowerShell (я сделал что-то подобное, используя bash):
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 работал без изменений. Я буду добавлять сюда рабочие решения по мере их проверки.
удар:
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