Como encontrar os arquivos mais recentes em um diretório, incluindo subdiretórios?

12

Estou procurando uma maneira no Windows de listar todos os arquivos em um determinado diretório e seus subdiretórios, classificados para que os arquivos mais recentes estejam no topo. Existe alguma maneira fácil de fazer isso? Eu também aceitaria um script Perl.

Kip
fonte

Respostas:

3

Se você ainda estiver interessado em uma solução com script, juntei rapidamente algo que exibirá arquivos de todos os diretórios:

#!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";
}

Os arquivos são exibidos do mais recente para o mais antigo, mostrando apenas o nome do arquivo. Dessa maneira, você pode canalizar facilmente a saída desse script para outra ferramenta de processamento sem precisar se preocupar em eliminar a saída em excesso.

Uso: perl find.pl <starting_directory>

John T
fonte
obrigado. Eu acho que isso deveria ter sido uma questão de stackoverflow se foi nessa direção. :)
Kip
1
algumas alterações que fiz (para a ajuda de qualquer um que se depare com isso): my $dir = ($#ARGV >= 0 ? $ARGV[0] : '.');para que ele varra o diretório atual se o parâmetro do diretório não for fornecido e inclua o tempo impresso:print strftime('%Y-%m-%d %H:%M:%S', localtime((stat($key))[9])) . " $key\n";
Kip
1
@Kip, o mtime deve ser armazenado $files{$key}se você quiser usá-lo durante a strftimeimpressão para evitar uma segunda chamada stat(). Se você planeja canalizá-lo para outro programa, também o modifiquei para exibir o caminho completo dos nomes de arquivos. Você pode obtê-lo aqui: pastebin.ca/1797748
John T
obrigado, você é mais rápido do que eu. o comando stat também funcionou para arquivos no diretório atual, pois você estava armazenando apenas a última parte do nome do arquivo.
Kip
7

Como isso: dir /s /o:-d

SLaks
fonte
1
hmm ... não exatamente ideal, este ainda lista cada diretório individualmente, mas eu posso trabalhar com ele
Kip
5

Se você tem o cygwin ou similar instalado, find . -type f | xargs ls -trele fará o truque. Você quase certamente pode fazer o mesmo com o PowerShell da Microsoft.

David Spillett
fonte
3

Caso esteja usando Tudo , basta digitar o caminho e classificar por Data de modificação e você obterá todos os arquivos nesta pasta nessa ordem, independentemente do subdiretório.

Tudo é freeware, uma versão portátil está disponível.


fonte
1

Se você não se importa em codificar (embora isso leve a questão ao território Stack Overflow), existem as classes Directorye Fileem C #.

O GetFilesmétodo possui uma sobrecarga que retornará todos os nomes de arquivos em todos os subdiretórios. Você pode percorrer esta lista, ligando GetLastWriteTimepara obter a data / hora modificada. Armazene o nome e a hora em um dicionário, classifique a hora e imprima os nomes dos arquivos.

Há também as classes DirectoryInfoe FileInfo.

Eu deveria ter acrescentado que toda essa funcionalidade está disponível via Powershell , para que você não tenha acesso a um IDE completo.

ChrisF
fonte
obrigado. Eu sou um desenvolvedor, principalmente em java. Eu estava perguntando aqui esperando uma opção de shell estava disponível
Kip
@Kip - Eu percebi ontem à noite, depois que saí, que deveria ter mencionado o Powershell - technet.microsoft.com/en-us/scriptcenter/dd742419.aspx - é uma linguagem de script, mas você tem acesso ao tempo de execução do .NET.
ChrisF