ardixon
10/7/2013 - 4:00 PM

Checks directory for bad filenames.

Checks directory for bad filenames.

# created by Austin Dixon 6/12/2013

# checks directory for bad filenames

#! usr/local/bin/perl
use Tkx;
use LWP::Simple;

# SETUP
													
# frame objects
my $fa;
# label objects
my $la;
my $lb;
# button objects
my $ba;
my $bb;

#-------------------------------------------------
# convert button sub routine

sub chooseFile {
$dir = Tkx::tk___chooseDirectory();
$bb->configure( -state => 'active');
} 

#--------------------------------------------------
# file convert sub routine

sub runSub {

#----------
# open directory and parse (2 levels down)
opendir(DIR, $dir) or die "can't open $dir\n";
while ($file = readdir(DIR)){
	if ($file =~ /^\./){next;}  # skip dot files
	$path = $dir. "\\" . $file;
 
	if (-d $path){
    push (@dirs, $file);
	
	opendir(DIR_2, $path) or die "can't open $dir\n";
	while ($file_2 = readdir(DIR_2)){
		if ($file_2 =~ /^\./){next;}  # skip dot files
		$path_2 = $path. "\\" . $file_2;
		
			if (-d $path_2){
				push (@subdirs, $file_2);
				
				opendir(DIR_3, $path_2) or die "can't open $dir\n";
				while ($file_3 = readdir(DIR_3)){
					if ($file_3 =~ /^\./){next;}  # skip dot files
					push (@files, $file_3);
						if (!($file_3 =~ /^[a-z]{1}\d{4}\_\d{7}\_\d{7}(\_\d{4}(\_\d{3})?)?\.[\w]{2,4}$/)){
						push (@badnames, $file_3);
						}
				}
			}
		
	
	
		else {
		push (@files, $file_2);
		if (!($file_2 =~ /^[a-z]{1}\d{4}\_\d{7}\_\d{7}(\_\d{4}(\_\d{3})?)?\.[\w]{2,4}$/)){
			push (@badnames, $file_2);
			}
		}
		}
	}	
    
	
	else {
	push (@files, $file);
		if (!($file =~ /^[a-z]{1}\d{4}\_\d{7}\_\d{7}(\_\d{4}(\_\d{3})?)?\.[\w]{2,4}$/)){
		push (@badnames, $file);
		}
	}
close(DIR);
close(DIR_2);
close(DIR_3);
}

#----------
# examine baddirs
$num = 0;
while ($num < @dirs){
	if (!(@dirs[$num] =~ /^[a-z]{1}\d{4}\_\d{7}\_\d{7}(\_\d{4}(\_\d{3})?)?$/)){
		push (@baddirs, @dirs[$num]);
		$num ++;
		}
	$num ++;
	}

#----------
# examine badnames
$num = 0;
while ($num < @badnames){
	if (!(@badnames[$num] =~ /^[a-z]{1}\d{4}\.*/)){
		push (@bad_group, @badnames[$num]);
		$num ++;
		}
	elsif (!(@badnames[$num] =~ /^[a-z]{1}\d{4}\_\d{7}\.*/)){
		push (@bad_collection, @badnames[$num]);
		$num ++;
		}
	elsif (!(@badnames[$num] =~ /^[a-z]{1}\d{4}\_\d{7}\_\d{7}\.*/)){
		push (@bad_item, @badnames[$num]);
		$num ++;
		}	
	elsif (!(@badnames[$num] =~ /^[a-z]{1}\d{4}\_\d{7}\_\d{7}\_\d{4}\_\d{3}\.*/)){
		push (@bad_page, @badnames[$num]);
		$num ++;
		}	
	elsif (!(@badnames[$num] =~ /^.*[\w]{2,4}/)){
		push (@bad_extension, @badnames[$num]);
		$num ++;
		}	
	$num ++;
	}

#----------
# if none found
$none = "None Found";
if (@badnames == 0){
	push (@badnames, $none)
}
if (@baddirs == 0){
	push (@baddirs, $none)
}

#----------
# sort
@sorted_dirs = sort { lc($a) cmp lc($b) } @dirs;
@sorted_subdirs = sort { lc($a) cmp lc($b) } @subdirs;
@sorted_files = sort {$a <=> $b;} @files;
@sorted_badnames = sort {$a <=> $b;} @badnames;
@sorted_baddirs = sort { lc($a) cmp lc($b) } @baddirs;

@sorted_group = sort {$a <=> $b;} @bad_group;
@sorted_collection = sort {$a <=> $b;} @bad_collection;
@sorted_item = sort {$a <=> $b;} @bad_item;
@sorted_page = sort {$a <=> $b;} @bad_page;
@sorted_extension = sort {$a <=> $b;} @bad_extension;
@sorted_underscore = sort {$a <=> $b;} @bad_underscore;

#----------
# print results
open (MYFILE, ">output.txt");
print MYFILE "I found: \n\n";
$count = scalar @dirs;
print MYFILE "$count directories \n";
$count = scalar @subdirs;
print MYFILE "$count sub-directories \n";
$count = scalar @files;
print MYFILE "$count files \n";
	
$num = 0;
$count = scalar @badnames;
print MYFILE "\n---------------------------------------------- \n\n";
print MYFILE "The following $count files are named incorrectly: \n\n";
while ($num < @sorted_badnames){	
	print MYFILE "@sorted_badnames[$num] \n";
	$num ++;
	}
	
$num = 0;
$count = scalar @baddirs;
print MYFILE "\n---------------------------------------------- \n\n";
print MYFILE "The following $count directories are named incorrectly: \n\n";
while ($num < @sorted_baddirs){	
	print MYFILE "@sorted_baddirs[$num] \n";
	$num ++;
	}

$num = 0;
print MYFILE "\n\n\n***************************************************************************** \n";
print MYFILE "***************************************************************************** \n\n\n";
print MYFILE "The following items have a bad holding group: \n\n";
while ($num < @sorted_group){	
	print MYFILE "@sorted_group[$num] \n";
	$num ++;
	}
	
$num = 0;
print MYFILE "\n---------------------------------------------- \n\n";
print MYFILE "The following items have a bad collection number: \n\n";
while ($num < @sorted_collection){	
	print MYFILE "@sorted_collection[$num] \n";
	$num ++;
	}

$num = 0;
print MYFILE "\n---------------------------------------------- \n\n";
print MYFILE "The following items have a bad item number: \n\n";
while ($num < @sorted_item){	
	print MYFILE "@sorted_item[$num] \n";
	$num ++;
	}
	
$num = 0;
print MYFILE "\n---------------------------------------------- \n\n";
print MYFILE "The following items have a bad page number: \n\n";
while ($num < @sorted_page){	
	print MYFILE "@sorted_page[$num] \n";
	$num ++;
	}

$num = 0;
print MYFILE "\n---------------------------------------------- \n\n";
print MYFILE "The following items have a bad file extension: \n\n";
while ($num < @sorted_extension){	
	print MYFILE "@sorted_extension[$num] \n";
	$num ++;
	}
	
close (MYFILE); 

}

#---------------------------------------------------
# GUI elements

# main window
my $mw = Tkx::widget->new(".");
$mw->g_wm_title("Bad Name Checker");
$mw->g_wm_minsize(200, 130);

# frame a
$fa = $mw->new_frame(
-relief => 'solid',
-borderwidth => 1,
-background => 'light gray',
);
$fa->g_pack( -side => 'left', -fill => 'both' );

#---------------------------------------------------
# choose file

$la = $fa->new_label(
-text => '       Choose Directory to Scan:       ',
-font => 'bold',
-bg => 'light gray',
-foreground => 'black',
);
$la->g_pack( -side => 'top', -fill => 'both' );

$lb = $fa->new_label(
-bg => 'blue',
-foreground => 'cyan',
-width => 30,
-textvariable => \$dir,
);
$lb->g_pack( -side => 'top' );

$ba = $fa->new_button(
-text => 'Choose',
-command => \&chooseFile,
-height => 1,
-width => 15,
);
$ba->g_pack( -side => 'top', -pady => 5 );

#---------------------------------------------------
# convert button

$bb = $fa->new_button(
-borderwidth => 1,
-text => 'RUN',
-font => 'bold',
-command => \&runSub,
-state => 'disabled',
-height => 2,
-width => 15,
);
$bb->g_pack( -side => 'bottom', -pady => 10 );

#---------------------------------------------------

Tkx::MainLoop();