Tenemos una lista de (digamos 50) informes que se vuelcan en varias carpetas dependiendo de ciertas condiciones. Todos los informes tienen nombres estándar, por ejemplo. D099C.LIS, D18A0.LIS etc.secuencia de comandos Bash/DOS/PowerShell para listar las versiones más recientes de los archivos?
A veces, un informe puede existir en hasta 5 ubicaciones diferentes, y necesito generar una lista de todas las ubicaciones de la versión más reciente de cada informe.
Lo puedo hacer fácilmente usando código, o redireccionando salida "dir" o "ls" a un archivo de texto y luego manipulándolo en Excel, pero preferiría una solución más simple (ojalá una línea) ya sea usando DOS, bash o PowerShell.
El mejor que he encontrado hasta el momento en PowerShell (que he hecho algo similar usando bash) es:
ls -r -fi *.lis | sort @{expression={$_.Name}}, @{expression={$_.LastWriteTime};Descending=$true} | select Directory, Name, lastwritetime
que la voluntad de forma recursiva una lista de todos los archivos con la extensión * .lis, luego clasificarla por nombre (asc) y fecha (desc), y luego mostrar el directorio, nombre y fecha.
Esto le da a este tipo de salida:
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
Lo que obviamente tendrá que hacer ahora es eliminar los archivos que no son las versiones más recientes, por lo que la salida se parece a esto (no demasiado preocupado formateo todavía):
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
¿Alguien tiene alguna idea?
[editar] Algunas buenas ideas y respuestas a esta pregunta. Desafortunadamente no puedo marcar todo como aceptado, pero la respuesta de EBGreen (editada) funcionó sin modificaciones. Agregaré soluciones de trabajo aquí mientras las verifico.
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
Eso solo da los primeros 3 en la lista. No es lo que quiero en absoluto.Necesito una lista de la versión más reciente de cada archivo. – ilitirit
Aaah ... No entendí bien. Trabajaré en eso. – EBGreen
Ver si eso funciona ahora. – EBGreen