#!/usr/bin/perl -w # Script to generate a single list of files below a specific directory # Used for Mutt's mailboxes options # e.g. mailboxes `mailboxes.pl ~/Mail outbox` # Parameters are # 1. Directory to recurse from e.g. ~/Mail # 2. Filenames to ignore (comma separated list) e.g. outbox,oldmail # Written by Darren Greaves # http://krapplets.org/linux/ use strict; my $dir = $ARGV[0]; my $ignore = $ARGV[1]; my $entry = ""; my $list = ""; my @filter = (); if (!defined($dir)) { print STDERR "Usage: mailboxes.pl "; print STDERR " [comma separated list of files to ignore]\n"; exit; } if (defined($ignore)) { @filter = split (/,/, $ignore); } &checkDir(\$dir, \$list, \@filter); print "$list\n"; sub checkDir ($dir, $list, @filter) { my ($dir, $list, $filter) = @_; my @files = (); opendir(DIR, $$dir) || die ("Unable to open $dir as a directory $!"); # As this function is recursive and the DIR variable is global # The recursive reading of directories breaks # So, read it into a local array for each recursive call while (defined($entry = readdir(DIR))) { push (@files, $entry); } close (DIR); foreach $entry (@files) { if (! -d "$$dir/$entry") { if (&filter(\$entry, \@$filter) == 1) { $$list .= " " . "$$dir/$entry"; } } else { if ($entry !~ /^\.{1,2}$/) { if (&filter(\$entry, \@$filter) == 1) { my $newdir = "$$dir/$entry"; &checkDir (\$newdir, \$$list, \@filter) } } } } } sub filter ($entry, @filter) { my $allow = 1; my ($entry, $filter) = @_; foreach $_ (@$filter) { if ($$entry eq $_) { $allow = 0; } } return $allow; }