#!/usr/bin/perl -w # Script to generate a single list of Maildir folders below a specific directory # Parameters are # 1. Directory to recurse from e.g. ~/Mail # 2. Directories to ignore (comma separated list) e.g. outbox use strict; my $dir = $ARGV[0]; my $ignore = $ARGV[1]; my $entry = ""; my $list = ""; my @filter = (); if (!defined($dir)) { print STDERR "Usage: maildirs "; print STDERR " [comma separated list of directories 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); } foreach $entry (@files) { if ((&properDir("$entry") == 1) && (-d "$$dir/$entry")) { if (&filter(\$entry, \@$filter) == 1) { if (&isMaildir("$$dir/$entry")) { $$list .= " " . "$$dir/$entry"; } my $newdir = "$$dir/$entry"; &checkDir (\$newdir, \$$list, \@filter) } } } close (DIR); } # properDir # skips the following subdirs, ., .., cur, new and tmp sub properDir($dir) { my $dir = $_[0]; if ($dir eq ".") { return 0; } if ($dir eq "..") { return 0; } if ($dir eq "cur") { return 0; } if ($dir eq "new") { return 0; } if ($dir eq "tmp") { return 0; } return 1; } # isMaildir # must have at least the following three subdirs, cur, new and tmp sub isMaildir($dir) { my $dir = $_[0]; my $entry = ""; my $match = 0; opendir(SUBDIR, $dir) || die ("Unable to open $dir as a directory $!"); while (defined($entry = readdir(SUBDIR))) { if ($entry eq "cur") { $match++; } elsif ($entry eq "new") { $match++; } elsif ($entry eq "tmp") { $match++; } } close (SUBDIR); if ($match == 3) { return 1; } else { return 0; } } sub filter ($entry, @filter) { my $allow = 1; my ($entry, $filter) = @_; foreach $_ (@$filter) { if ($$entry eq $_) { $allow = 0; } } return $allow; }