¿Cómo encontrar los archivos más nuevos en un directorio, incluidos los subdirectorios?

12

Estoy buscando una manera en Windows para enumerar todos los archivos en un directorio dado y sus subdirectorios, ordenados de manera que los archivos más nuevos estén en la parte superior. ¿Hay alguna manera fácil de hacer esto? También me conformaría con un guión de Perl.

Dormir
fuente

Respuestas:

3

Si todavía está interesado en una solución con script, rápidamente he agregado algo que mostrará archivos de todos los directorios juntos:

#!C:/Perl/bin/perl.exe
use File::Find;

my %files = ();

sub process
{
    $files{$_} = (stat($_))[9] unless -d $_;
}

find (\&process, $ARGV[0]);

foreach my $key(sort {$files{$b} <=> $files{$a}} keys %files)
{
    print "$key\n";
}

Los archivos se muestran más nuevos a más antiguos, mostrando solo el nombre del archivo. De esta forma, puede canalizar fácilmente la salida de este script a otra herramienta para el procesamiento sin tener que preocuparse por eliminar el exceso de salida.

Uso: perl find.pl <starting_directory>

John T
fuente
Gracias. Supongo que esta debería haber sido una pregunta de stackoverflow si fue en esta dirección. :)
Kip
1
Realicé algunos cambios (para la ayuda de cualquier persona que se encuentre con esto): my $dir = ($#ARGV >= 0 ? $ARGV[0] : '.');para que escanee el directorio actual si no se proporciona el parámetro del directorio e incluya el tiempo que se imprime:print strftime('%Y-%m-%d %H:%M:%S', localtime((stat($key))[9])) . " $key\n";
Kip
1
@Kip, el mtime debe almacenarse $files{$key}si desea usarlo para strftimeimprimir para evitar una segunda llamada stat(). Si planea canalizarlo a otro programa, también lo modifiqué para mostrar la ruta completa de los nombres de archivo. Puede obtenerlo aquí: pastebin.ca/1797748
John T
gracias, eres más rápido que yo. el comando stat solo funcionó para archivos en el directorio actual, ya que solo estaba almacenando la última parte del nombre de archivo.
Kip
7

Me gusta esto: dir /s /o:-d

SLaks
fuente
1
hmm ... no del todo ideal, esto todavía enumera cada directorio individualmente, pero puedo trabajar con él
Kip
5

Si tiene instalado cygwin o similar, entonces find . -type f | xargs ls -trhará el truco. Es casi seguro que puedes hacer algo similar con el PowerShell de Microsoft.

David Spillett
fuente
3

En caso de que esté usando Everything , simplemente escriba la ruta y ordene por Fecha de modificación y obtendrá todos los archivos en esta carpeta en ese orden, independientemente del subdirectorio.

Todo es freeware, hay disponible una versión portátil.


fuente
1

Si no le importa codificar (aunque esto lleva la pregunta al territorio de desbordamiento de pila), existen las clases Directoryy Fileen C #.

El GetFilesmétodo tiene una sobrecarga que devolverá todos los nombres de archivo en todos los subdirectorios. Luego puede recorrer esta lista, llamando GetLastWriteTimepara obtener la fecha / hora modificada. Almacene el nombre y la hora en un diccionario, ordene la hora e imprima los nombres de archivo.

También hay clases DirectoryInfoy FileInfo.

Debería haber agregado que toda esta funcionalidad está disponible a través de Powershell , por lo que no tiene acceso a un IDE completo.

ChrisF
fuente
Gracias. Soy desarrollador aunque principalmente en Java. Estaba preguntando aquí esperando que hubiera una opción de shell disponible
Kip
@Kip - Me di cuenta anoche después de cerrar sesión que debería haber mencionado Powershell - technet.microsoft.com/en-us/scriptcenter/dd742419.aspx - es un lenguaje de scripting pero tienes acceso al tiempo de ejecución de .NET.
ChrisF