#!/usr/bin/perl -w use strict; use File::Find; my $breakpage = 0; my $short = 1; my $cols = 0; my $width = 70; my $underchar = "\x{00AF}"; # or try "\x{007E}" (tilde) my $list = build_list(\@ARGV); printto_columns($list); sub build_list{ my %gather_list; my $directory_list = shift; for my $topdir (sort(@$directory_list)){ print "Listing $topdir\n"; $topdir =~ tr~\\~/~; find(\&{sub{ unless (defined $gather_list{$File::Find::dir}){ ($gather_list{$File::Find::dir}) = map{ [ m{([^/]+)$} ] } "$File::Find::dir" ; } return if m{\.$}; my $item = -d $_ ? "+[ $_ ]" : $_; push @{$gather_list{$File::Find::dir}}, $item; }}, $topdir); }; return \%gather_list; } sub printto_columns{ my $hashoflists = shift; for my $key_hdr (sort keys %$hashoflists){ my $short_hdr = shift @{$hashoflists->{$key_hdr}}; # assemble a header for each list my $header = ""; $header .= "\f" if $breakpage; if ($short){ $header .= "\n$short_hdr:\n" . ($underchar x (length $short_hdr)) . "\n"; }else{ my ($path_hdr) = $key_hdr; $path_hdr =~ tr{/}{\\} if $^O =~ /Win/i; $header .= "\n$path_hdr\n" . ($underchar x (length $path_hdr)) . "\n" ; } print $header unless $header eq "\f"; # split to columns called for, here. my ($grid,$columns) = distribute_evenly($hashoflists->{$key_hdr}) ; my $pad_to_page = int($width / $columns); for my $x_coord (0..scalar @{$grid->[0]}){ my $row = ""; for my $y_coord (0..$columns-1){ my $cell = defined $grid->[$y_coord]->[$x_coord] ? $grid->[$y_coord]->[$x_coord] : ""; my $spacer = $pad_to_page - length ($cell); $spacer = 1 if $spacer <= 0; my $pad_col = $y_coord < $columns-1 ? "\x{0020}" x $spacer : ""; $row .= length ($row) + length ($cell) > $width ? "\n". ("\x{0020}" x ($width - (length $cell)))."$cell\n" : ${cell}.${pad_col}; } print "$row\n"; } } } sub distribute_evenly{ my $chunks = shift; my $bowls = $cols || int( $width / (maxsize($chunks)*1.10) ) ; my @alphabet_soup = sort @$chunks; my @ladels = map {int((@alphabet_soup)*$_/$bowls)} -$bowls..0; ([map {[@alphabet_soup[$ladels[$_-1]..($ladels[$_]-1)]]} 1..$bowls],$bowls); } sub maxsize{ my $maxsize = 0; my $to_measure = shift; for (@$to_measure){ my $thissize = length; $maxsize = $thissize unless $maxsize > $thissize; } $maxsize ; } __END__