All pastes #177978 Raw Edit

Mine

public text v1 · immutable
#177978 ·published 2006-09-20 21:34 UTC
rendered paste body
#!/usr/bin/perl -w
# Library v0.2
# Organise your eBooks
# Mabus
# Started: 13/09/06
# This copy saved: 17/09/06

#If you're not me, change this to your own directory!
my $directory = "/home/mabus/doc/library";
my $count = 0;
opendir DIR, $directory or die "Couldn't open $directory :$!\n"; 

#interface to receive commands and call functions
while(<STDIN>){
	my @args = split;
	$_ = shift @args;
	&authmod($args[0], $args[1]) if ((/^authmod/i) and (@args == 2));
	&dotform if (/^dotform$/i);
	&help if (/^help$/i);
	&remdate if (/^remdate$/i);
	&remdupe if (/^remdupe$/i);
	&replace($args[0], $args[1]) if ((/^replace/i) and (@args == 2));
	&remauth if (/^remauth$/i);
	&term($args[0]) if ((/^term/i) and (@args == 1));
	&version if (/^version$/i);
}

#Same as replace, but code changed to modify the first term
sub authmod{
        my $terminate = $_[0];
        my $newterm = $_[1];
        foreach $file (readdir DIR){
                (my $converted = $file) =~ s/^$terminate\./.$newterm./g;
                if ($file ne $converted){
                        $count += 1;
                        rename $file, $converted;
                }
        }
        print "Changed $count number of books labelled $terminate to $newterm.\n";
        $count = 0;

}

#Puts books in a OReilly.Learning.Perl.Fourth.Edition.chm format
sub dotform{
	foreach $file (readdir DIR){
		#replace commas, hyphens, ()s, colons, and spaces with periods
		(my $converted = $file) =~ s/[\(\)_, -:]/./g;
		#remove apostrophes
		$converted =~ s/\'//g;
		#remove duplicate periods
		$converted =~ s/\.{2,}/./g;
		#if anything but a period is the fourth to last character, put one in
		#this will make sure all files have extensions
		$converted =~ s/[^.](.{3})$/.$1/;
		#If the filename is going to be changed, change it
		if ($file ne $converted){
			$count += 1;
			rename $file, $converted;
		}
	}
	print "$count filenames formatted.\n";
	$count = 0;
}

#rather cluttered help message, I should write a readme
sub help{
	print "authmod\tLike replace, but must be the start of the filename.\n";
	print "dotform\tConverts Me - Book One.pdf to Me.Book.One.pdf\n";
	print "help\tThis menu\n";
	print "remauth\tRemoves all of those author suffixes common in torrents\n";
	print "remdate\tRemoves those mon.year extensions such as Apr.2006.pdf.\n";
	print "remdupe\tNotifies of duplicate titles with differing extensions\n";
	print "replace\tTakes two terms, replaces instances of first with second, if term is surrounded by dots\n";
	print "term\tTakes a term as an argument, instances of term in your files is removed if surrounded by dots\n";
	print "version\tPrints version info\n";
}

#removes all of those nasty author tags... who needs that spam?
sub remauth{
	my @authors = qw/ eBook EEn iNTENSITY LiB DDU EITheLiSO BBL JGT SUN KB CAUDEX /;
	foreach (@authors){
		&term($_)
	}
}

#so far we have a few different formats it removes, but basically it tries to take those timestamps off
sub remdate{
	foreach $file (readdir DIR){
		#removes .Mon.200x. type stuff
		(my $converted = $file) =~ s/\..{3}.200.\.(.{3})$/.$1/;
		#removes 200x.ext type stuff
		$converted =~ s/200.\.(.{3})$/$1/;
		#removes Datecode.06062006 type stuff
		$converted =~ s/Datecode\.\d{8}\.(.{3})/$1/i;
		if ($file ne $converted){
			$count += 1;
			rename $file, $converted;
		}
	}
	print "Removed $count dates.\n";
	$count = 0;
}

#Lets you know if you have the same title with multiple extensions
sub remdupe{
	foreach $file (readdir DIR){
		$file =~ s/.{3}$//;
		foreach $test (readdir DIR){
			$test =~ s/.{3}$//;
			print $file . " has a duplicate.\n";
		}
        }
}

#replaces a given term with a second given term, note that only entire sections between periods will work
#such as blah.foo.bar, you can replace foo... but in foobar it will not replace foo
#this is to prevent certain title manglings from accidentally happening
#term has similar behaviour to this
sub replace{
	my $terminate = $_[0];
	my $newterm = $_[1];
        foreach $file (readdir DIR){
		(my $converted = $file) =~ s/\.$terminate\./.$newterm./g;
                if ($file ne $converted){
                        $count += 1;
                        rename $file, $converted;
                }
        }
        print "Replaced $count instances of $terminate with $newterm.\n";
        $count = 0;
}

#removes a term given as an argument, case insensitive, if its preceded and followed by periods
#see replace for info on what it replaces (basically, only replaces foo in xxx.foo.bar not foobar)
sub term{
	my $terminate = $_[0];
        foreach $file (readdir DIR){
		(my $converted = $file) =~ s/\.$terminate\.//g;
                if ($file ne $converted){
                        $count += 1;
                        rename $file, $converted;
                }
        }
        print "Removed $count instances of $terminate.\n";
        $count = 0;
}

#Well, pretty simple. You get it.
sub version{
	print "Library v0.2\n";
	print "Author:\tmabus\n";
	print "Email:\tmabus\@aculei.net\n";
	print "Site:\thttp://aculei.net/~mabus\n";
}