#!/usr/bin/env perl use strict; use warnings; use constant { INODE => 1, FSIZE => 7, MTIME => 9, }; use Cwd 'cwd'; use File::Find; use Time::Piece; my $wDirectory = cwd(); find(\&wanted, $wDirectory); transform($wDirectory); display(); { my ($data_for, $ignore_re, $display_fmt); BEGIN { $ignore_re = qr{(?mx: \. (?: pl | swp \z ) )}; $display_fmt = "%-6s %3d %6d %-10s %17d [%d]\n"; } sub wanted { return unless -f $File::Find::name; return if $_ =~ $ignore_re; $data_for->{$File::Find::name} = { dir => $File::Find::dir, file => $_, stat => [ stat _ ], }; return; } sub transform { my ($cwd) = @_; for my $path (keys %$data_for) { my $data = $data_for->{$path}; my $t = localtime($data->{stat}[MTIME]); my $date = $t->ymd(); $date =~ y/-//d; my $rel_dir = join substr($data->{dir}, length $cwd), qw{. /}; @$data{qw{date rel_dir inode size mtime}} = ($date, $rel_dir, @{$data->{stat}}[INODE, FSIZE, MTIME]); } return; } sub display { my @display_fields = qw{file size date rel_dir inode mtime}; printf $display_fmt, @{$data_for->{$_}}{@display_fields} for sort { $data_for->{$a}{mtime} <=> $data_for->{$b}{mtime} } keys %$data_for; return; } }