Bagaimana menemukan file terbaru dalam direktori, termasuk subdirektori?

12

Saya mencari cara di Windows untuk mendaftar semua file dalam direktori dan subdirektori yang diberikan, diurutkan sehingga file terbaru ada di atas. Apakah ada cara mudah untuk melakukan ini? Saya juga setuju untuk skrip Perl.

Tidur
sumber

Jawaban:

3

Jika Anda masih tertarik dengan solusi skrip, saya dengan cepat melemparkan sesuatu yang akan menampilkan file dari semua direktori bersama-sama:

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

File ditampilkan terbaru ke terlama, hanya menampilkan nama file. Dengan cara ini Anda dapat dengan mudah menyalurkan output dari skrip ini ke alat lain untuk diproses tanpa harus khawatir tentang membuang kelebihan output.

Pemakaian: perl find.pl <starting_directory>

John T
sumber
Terima kasih. Saya kira ini seharusnya menjadi pertanyaan stackoverflow jika pergi ke arah ini. :)
Kip
1
beberapa perubahan yang saya buat (untuk bantuan siapa pun yang kebetulan menemukan ini): my $dir = ($#ARGV >= 0 ? $ARGV[0] : '.');sehingga akan memindai direktori saat ini jika parameter direktori tidak diberikan, dan untuk memasukkan waktu yang dicetak:print strftime('%Y-%m-%d %H:%M:%S', localtime((stat($key))[9])) . " $key\n";
Kip
1
@ Tip, mtime harus disimpan $files{$key}jika Anda ingin menggunakannya strftimesaat mencetak untuk menghindari panggilan kedua stat(). Jika Anda berencana untuk memipakannya ke program lain, saya juga memodifikasinya untuk menampilkan path lengkap dari nama file. Anda dapat mengambilnya di sini: pastebin.ca/1797748
John T
terima kasih, kamu lebih cepat dari aku. perintah stat hanya berfungsi untuk file di direktori saat ini juga, karena Anda hanya menyimpan bagian terakhir dari nama file.
Kip
7

Seperti ini: dir /s /o:-d

Slaks
sumber
1
hmm ... tidak cukup ideal, ini masih mencantumkan setiap direktori satu per satu, tetapi saya dapat bekerja dengannya
Kip
5

Jika Anda memiliki cygwin atau sejenisnya diinstal maka find . -type f | xargs ls -trakan melakukan trik. Anda hampir pasti dapat melakukan hal serupa dengan Microsoft PowerShell.

David Spillett
sumber
3

Jika Anda menggunakan Semuanya , cukup ketik lintasan dan urutkan berdasarkan Tanggal Dimodifikasi dan Anda akan mendapatkan semua file dalam folder ini dalam urutan itu, terlepas dari subdirektori.

Semuanya freeware, versi portabel tersedia.


sumber
1

Jika Anda tidak keberatan coding (meskipun ini membawa pertanyaan ke wilayah Stack Overflow) maka ada kelas Directorydan Filedi C #.

The GetFilesmetode memiliki kelebihan yang akan mengembalikan semua nama file di semua subdirektori. Anda kemudian dapat mengulang daftar ini, menelepon GetLastWriteTimeuntuk mendapatkan tanggal / waktu yang dimodifikasi. Menyimpan nama dan waktu dalam kamus, mengurutkan waktu dan mencetak nama file.

Ada juga kelas DirectoryInfodan FileInfo.

Saya seharusnya menambahkan bahwa semua fungsi ini tersedia melalui Powershell , jadi Anda tidak memiliki akses ke IDE penuh.

ChrisF
sumber
Terima kasih. saya seorang pengembang meskipun terutama di java. saya bertanya di sini berharap opsi shell tersedia
Kip
@ Tip - Saya menyadari tadi malam setelah saya logout bahwa saya seharusnya menyebutkan Powershell - technet.microsoft.com/en-us/scriptcenter/dd742419.aspx - ini adalah bahasa scripting tetapi Anda memiliki akses ke runtime .NET.
ChrisF
1

Jika Anda memiliki sesuatu seperti Git Bash atau Cygwin yang diinstal, Anda seharusnya dapat menggunakan salah satu jawaban dari sini: /programming/4561895/how-to-recursively-find-the-latest-modified -file-in-a-direktori

Salah satu yang bekerja dengan baik untuk saya adalah: find . -type f -printf '%TF %TT %p\n' | sort -r

Anda juga dapat menambahkan | head -10hingga akhir untuk melihat 10 yang terbaru, katakanlah.

peterflynn
sumber