#!/usr/bin/perl -w # Randolph Langley, FSU, 2014 # a trivial Perl script to check if filesystem numbers obey Benford's law # use strict; use File::stat; my @counts; # the obvious; 1-> counts initial one's, 2-> counts initial two's my $dir = "."; if(defined($ARGV[0])) { $dir = $ARGV[0]; chdir($dir); } my $s = stat($dir); my $devicenumber = $s->dev; print "Device number is $devicenumber\n"; sub do_count { my $dir = shift; my $s = stat($dir); return if ($s->dev != $devicenumber); # make sure that we didn't change devices chdir($dir) or return; opendir(DH,".") or goto end; my @entries = readdir(DH) or goto end; close(DH); foreach(@entries) { next if($_ eq "."); next if($_ eq ".."); next if(-l $_); if(-f $_) { my $st = stat($_) or next; my $size = $st->size; my $index = substr($size,0,1); $counts[$index]++; } if(-d $_) { do_count($_); } } end: chdir(".."); } &do_count($dir); print("Starts with\n"); my $i; my $sum = 0; for($i=0;$i<10;$i++) { $sum+=$counts[$i]; } for($i=1;$i<10;$i++) { my $ratio = $counts[$i] / $sum * 100; printf(" $i --> $counts[$i] times (%5.2f)\n",$ratio) if(defined($counts[$i])); } my $ratio = $counts[0] / $sum * 100; printf(" 0 --> $counts[0] times (%5.2f)\n",$ratio) if(defined($counts[$i]));