use strict; use warnings; use feature 'say'; use File::Find::Rule; my $dir = 'C:\testdir'; if ($#ARGV >= 0) {$dir = $ARGV[0];} my $rule = File::Find::Rule->new; my @items = $rule->in($dir); my @fields = ("dev","ino","mode","nlink","uid","gid","rdev","size","atime", "mtime","ctime","blksize","blocks"); my %num; my $index = 0; foreach my $field (@fields) { $num{$field} = $index; $index++; } foreach my $item (@items) { my $type = (-f $item) ? 'file' : (-l $item) ? 'symbolic link' : (-d $item) ? 'directory' : (-b $item) ? 'block special file' : (-c $item) ? 'character special file' : (-p $item) ? 'named pipe' : (-S $item) ? 'socket' : 'unkown'; my (@lstat) = lstat $item; my %times; foreach my $time ("atime","ctime","mtime") { $times{$time} = localtime($lstat[$num{$time}]); } my $size = commify($lstat[$num{'size'}]); my $perms = sprintf "%04o", $lstat[$num{'mode'}] & 07777; $item =~ s|\/|\\|g; say "Found item '$item'"; say " Type: $type"; say " Permissions: $perms"; say " Size: $size bytes"; say " Access Time: $times{'atime'}"; say " Inode change time: $times{'ctime'}"; say " Last modify time: $times{'mtime'}"; say "\n"; } sub commify { my $input = shift; $input = reverse $input; $input =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g; return reverse $input; }