Comment trouver les fichiers les plus récents dans un répertoire, y compris les sous-répertoires?

12

Je cherche un moyen dans Windows de répertorier tous les fichiers dans un répertoire donné et ses sous-répertoires, triés de sorte que les fichiers les plus récents soient au top. Existe-t-il un moyen simple de procéder? Je me contenterais également d'un script Perl.

Kip
la source

Réponses:

3

Si vous êtes toujours intéressé par une solution scriptée, j'ai rapidement jeté quelque chose ensemble qui affichera les fichiers de tous les répertoires ensemble:

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

Les fichiers sont affichés du plus récent au plus ancien, affichant uniquement le nom du fichier. De cette façon, vous pouvez facilement diriger la sortie de ce script vers un autre outil pour le traitement sans avoir à vous soucier de supprimer la sortie excédentaire.

Usage: perl find.pl <starting_directory>

John T
la source
Merci. je suppose que cela aurait dû être une question de stackoverflow si cela allait dans ce sens. :)
Kip
1
quelques modifications que j'ai apportées (pour l'aide de tous ceux qui my $dir = ($#ARGV >= 0 ? $ARGV[0] : '.');pourraient rencontrer cela): afin qu'il analyse le répertoire actuel si le paramètre de répertoire n'est pas donné, et pour inclure l'heure imprimée:print strftime('%Y-%m-%d %H:%M:%S', localtime((stat($key))[9])) . " $key\n";
Kip
1
@Kip, le mtime doit être stocké dans $files{$key}si vous souhaitez l'utiliser strftimelors de l'impression pour éviter un deuxième appel à stat(). Si vous prévoyez de le rediriger vers un autre programme, je l'ai également modifié pour afficher le chemin complet des noms de fichiers. Vous pouvez le récupérer ici: pastebin.ca/1797748
John T
merci, tu es plus rapide que moi. la commande stat ne fonctionnait que pour les fichiers du répertoire actuel, car vous ne stockiez que la dernière partie du nom de fichier.
Kip
7

Comme ça: dir /s /o:-d

SLaks
la source
1
hmm ... pas tout à fait idéal, cela répertorie toujours chaque répertoire individuellement, mais je peux travailler avec
Kip
5

Si vous avez installé cygwin ou similaire, alors find . -type f | xargs ls -trfera l'affaire. Vous pouvez presque certainement faire de même avec le PowerShell de Microsoft.

David Spillett
la source
3

Dans le cas où vous utilisez tout , tapez simplement le chemin et triez par date de modification et vous obtiendrez tous les fichiers de ce dossier dans cet ordre, quel que soit le sous-répertoire.

Tout est freeware, une version portable est disponible.


la source
1

Si le codage ne vous dérange pas (bien que cela pose la question dans le territoire Stack Overflow), il y a les classes Directoryet Fileen C #.

La GetFilesméthode a une surcharge qui renverra tous les noms de fichiers dans tous les sous-répertoires. Vous pouvez ensuite parcourir cette liste en appelant GetLastWriteTimepour obtenir la date / heure modifiée. Enregistrez le nom et l'heure dans un dictionnaire, triez l'heure et imprimez les noms de fichiers.

Il y a aussi les classes DirectoryInfoet FileInfo.

J'aurais dû ajouter que toutes ces fonctionnalités sont disponibles via Powershell , vous n'avez donc pas accès à un IDE complet.

ChrisF
la source
Merci. je suis développeur mais principalement en java. je demandais ici en espérant qu'une option shell était disponible
Kip
@Kip - J'ai réalisé hier soir après ma déconnexion que j'aurais dû mentionner Powershell - technet.microsoft.com/en-us/scriptcenter/dd742419.aspx - c'est un langage de script mais vous avez accès au runtime .NET.
ChrisF