У нас есть список (скажем, 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]++'
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