Wie finde ich die neuesten Dateien in einem Verzeichnis, einschließlich Unterverzeichnissen?

12

Ich suche nach einer Möglichkeit in Windows, alle Dateien in einem bestimmten Verzeichnis und seinen Unterverzeichnissen so aufzulisten, dass die neuesten Dateien oben angezeigt werden. Gibt es eine einfache Möglichkeit, dies zu tun? Ich würde mich auch mit einem Perl-Skript zufrieden geben.

Pennen
quelle

Antworten:

3

Wenn Sie immer noch an einer Skriptlösung interessiert sind, habe ich schnell etwas zusammengestellt, das Dateien aus allen Verzeichnissen zusammen anzeigt:

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

Dateien werden vom neuesten zum ältesten angezeigt und zeigen nur den Dateinamen an. Auf diese Weise können Sie die Ausgabe dieses Skripts problemlos an ein anderes Tool zur Verarbeitung weiterleiten, ohne sich Gedanken über das Entfernen überschüssiger Ausgaben machen zu müssen.

Verwendung: perl find.pl <starting_directory>

John T.
quelle
Vielen Dank. Ich denke, dies hätte eine Frage zum Stapelüberlauf sein sollen, wenn es in diese Richtung gegangen wäre. :)
Kip
1
ein paar Änderungen, die ich vorgenommen habe (für die Hilfe von allen, die zufällig darauf gestoßen sind): my $dir = ($#ARGV >= 0 ? $ARGV[0] : '.');damit das aktuelle Verzeichnis gescannt wird, wenn kein Verzeichnisparameter angegeben ist, und um die Zeit print strftime('%Y-%m-%d %H:%M:%S', localtime((stat($key))[9])) . " $key\n";
Kip
1
@Kip, die mtime sollte in gespeichert werden, $files{$key}wenn Sie diese strftimebeim Drucken verwenden möchten , um einen zweiten Aufruf von zu vermeiden stat(). Wenn Sie vorhaben, es an ein anderes Programm weiterzuleiten, habe ich es auch so geändert, dass der vollständige Pfad der Dateinamen angezeigt wird. Sie können das hier holen: pastebin.ca/1797748
John T
Danke, du bist schneller als ich. Der Befehl stat funktionierte auch nur für Dateien im aktuellen Verzeichnis, da Sie nur den letzten Teil des Dateinamens gespeichert haben.
Kip
7

So was: dir /s /o:-d

SLaks
quelle
1
hmm ... nicht ganz ideal, dies listet immer noch jedes Verzeichnis einzeln auf, aber ich kann damit arbeiten
Kip
5

Wenn Sie Cygwin oder ähnliches installiert haben, reicht find . -type f | xargs ls -trdies aus. Mit der PowerShell von Microsoft können Sie mit ziemlicher Sicherheit Ähnliches tun.

David Spillett
quelle
3

Wenn Sie Everything verwenden , geben Sie einfach den Pfad ein und sortieren Sie nach Änderungsdatum. Sie erhalten alle Dateien in diesem Ordner in dieser Reihenfolge, unabhängig vom Unterverzeichnis.

Alles ist Freeware, eine tragbare Version ist verfügbar.


quelle
1

Wenn Ihnen das Codieren nichts ausmacht (obwohl dies die Frage in das Gebiet des Stapelüberlaufs führt), gibt es die Klassen Directoryund Filein C #.

Die GetFilesMethode hat eine Überladung, die alle Dateinamen in allen Unterverzeichnissen zurückgibt. Sie können dann diese Liste durchlaufen und aufrufen GetLastWriteTime, um das geänderte Datum und die geänderte Uhrzeit abzurufen. Speichern Sie den Namen und die Uhrzeit in einem Wörterbuch, sortieren Sie die Uhrzeit und drucken Sie die Dateinamen aus.

Es gibt auch die DirectoryInfound FileInfoKlassen.

Ich hätte hinzufügen sollen, dass all diese Funktionen über Powershell verfügbar sind , sodass Sie keinen Zugriff auf eine vollständige IDE haben.

ChrisF
quelle
Vielen Dank. Ich bin ein Entwickler, obwohl hauptsächlich in Java. Ich fragte hier in der Hoffnung, dass eine Shell-Option verfügbar war
Kip
@Kip - Ich habe gestern Abend festgestellt, nachdem ich mich abgemeldet habe, dass ich Powershell hätte erwähnen sollen - technet.microsoft.com/en-us/scriptcenter/dd742419.aspx - es ist eine Skriptsprache, aber Sie haben Zugriff auf die .NET-Laufzeit.
ChrisF