#!/usr/bin/perl # # Created: 2004jun09 Scott Birl sbirl+ISO9660@temple.edu # Modified: 2006mar30 Scott Birl # # Rename a bunch of files to the ISO9660 standard [specfically, Long file names (30 chars max.) ] # so that you can burn them easier to a CD or DVD. # # ie: filename.jpg.pgp --> FILENAME_JPG.PGP # ie: Filename.2.jpg.pgp --> FILENAME_2_JPG.PGP # # This program attempts to be as accurate as possible in renaming the files. # Some steps are taken to shorten some file extensions down. # # No data manipulation is done. No encryption. No compression. Just renaming. # # # keywords: # PERL # rename to ISO9660 rename files to ISO9660 # convert to ISO9660 convert files to ISO9660 # # # How to use on Windows. # ---------------------- # 1) Download Cygwin http://www.cygwin.com # A) Run this file from the commandline # ./convert_to_ISO9660.pl # # == OR == # # 2) Install ActiveState PERL http://www.activestate.com # A) Double-click on this file. # # # How to use on *n?X # ------------------ # 1) ./convert_to_ISO9660.pl # # # # LEGAL: # Use at your own risk. Source code provided AS IS. # Im not responsible for any and/or damage done to any and/or all # parts of the computer, hardware or software this program is ran on. # ################################################################################# use warnings; use strict; use File::Find; no warnings 'File::Find'; # Why isnt this working? my @directories_to_search=("I:\\"); # CHANGE THIS #-------------------------------------------- #my @directories_to_search=("C:\\", "I:\\"); # Windows # #my @directories_to_search=("/usr/local/bin","/"); # *n?x #-------------------------------------------- #my $DIRECTORY=""; my $FILE=""; my $Length=0; my $InfiniteLoopDetector=0; #opendir(DIRHandle, $DIRECTORY) or die "Could not open up $DIRECTORY: $!\n"; sub check_filename($) { # printf("--> check_filename\n"); my $filename = shift; my $Length = length($filename); my $NumberOfPeriods = 0; if ( $InfiniteLoopDetector++ > 500) { die "($InfiniteLoopDetector) Infinite loop detected while examining \"$filename\""; } for my $index (0 .. $Length) { $NumberOfPeriods++ if ( substr($filename, $index, 1) eq '.'); } if ($NumberOfPeriods > 1) { # printf("<-- check_filename (1)\n"); return 1; # bad filename } # if ($filename =~ /[^A-Z0-9_.\\\/:]/) if ($filename =~ /[^A-Z0-9_.]/) { # printf("<-- check_filename (1)\n"); return 1; # bad filename } elsif ( $Length > 30 ) { # printf("<-- check_filename (2)\n"); return 2; # filename too long } else { # printf("<-- check_filename (0)\n"); return 0; } } sub convert_filename($) { # printf("--> convert_filename\n"); my $NewFileName=shift; if ( $InfiniteLoopDetector++ > 500) { die "($InfiniteLoopDetector) Infinite loop detected while attempting to convert \"$NewFileName\""; } $NewFileName = uc($FILE); # Convert filename to uppercase $NewFileName =~ s/[^A-Z0-9_.]/_/g; # Convert anything not A-Z, 0-9, _ or . to _ $NewFileName =~ s/\.tar\.gz/\.TGZ/ig; # Convert .tar.gz to .TGZ $NewFileName =~ s/\.tar\.z/\.TZ/ig; # Convert .tar.Z to .TZ $NewFileName =~ s/peg$/PG/ig; # Convert peg to pg (like jpg, mpg) $NewFileName =~ s/.HTML$/.HTM/i; # As much as it kills me. if ($NewFileName =~ /(.+?)\.(\w+)\.pgp$/i) { $NewFileName = sprintf("%s_%s.PGP", $1, $2); } $NewFileName =~ s/_\././g; # Convert _. to . $NewFileName =~ s/\._/_/g; # Convert ._ to _ # Convert all but the last . to _ $NewFileName =~ s/\.(?=.*\.)/_/g; # zero-width positive look-ahead assertion. $NewFileName =~ s/_{2,}/_/g; # Collapse 2 or more consecutive underscores to 1 underscore # printf("<-- convert_filename\n"); return $NewFileName; } sub ConvertToISO9660 { # while ( defined ($FILE = readdir(DIRHandle)) ) # { my $NewFileName=""; my $RenameFileName; my $ReturnStatus; my $DIRECTORY; no warnings 'File::Find'; # Why isnt this working? $FILE = $_; # not $File::Find::name; $DIRECTORY = $File::Find::dir; return if ($FILE =~ /\.\.?$/); # return if (-d "$DIRECTORY\\$FILE"); # Skip directories return if (-d "$FILE"); # Skip directories $InfiniteLoopDetector=0; printf("\n\n($InfiniteLoopDetector) BEGIN: %-30s\n", $File::Find::name); $ReturnStatus = check_filename($FILE); #printf("Initial ReturnStatus is $ReturnStatus\n"); while ($ReturnStatus) { if ($ReturnStatus == 1) { $NewFileName = convert_filename($NewFileName); # printf("%-30s\n", $NewFileName); } elsif ($ReturnStatus == 2) { #next if ($NewFileName =~ /^$/); if ($NewFileName =~ /^$/) { $NewFileName=$FILE; } printf("\n$NewFileName is too long for ISO9660 (%d > 30)\n", length($NewFileName) ); printf(" |........|.........|.........| SKIP to go to the next file\n"); printf("Rename: "); $RenameFileName = <>; # Read from STDIN chomp($RenameFileName); # Get rid of \n last if ($RenameFileName =~ /^skip$/i); while ((-f "$DIRECTORY\\$RenameFileName") || (-d "$DIRECTORY\\$RenameFileName")) { last if ($RenameFileName =~ /^skip$/i); printf("******* $RenameFileName already exists.\n"); printf(" |........|.........|.........|\n"); printf("Rename: "); $RenameFileName = <>; # Read from STDIN chomp($RenameFileName); # Get rid of \n if ( $InfiniteLoopDetector++ > 500) { die "($InfiniteLoopDetector) Infinite loop detected with \"$NewFileName\""; } } printf("\twas: %s\n\tnow: %s (%d)\n\n", $NewFileName, $RenameFileName, length($RenameFileName)); $NewFileName=$RenameFileName; } else { die "ReturnStatus is $ReturnStatus ???\n"; } # printf("\t\tNewFileName: \"%s\"\n", $NewFileName); $ReturnStatus=check_filename($NewFileName); if ( $InfiniteLoopDetector++ > 500) { die "($InfiniteLoopDetector) Infinite loop detected with \"$NewFileName\""; } } # ENDS while if ($NewFileName =~ /^$/) { $NewFileName=$FILE; } printf("%-30s --> %-30s", $FILE, $NewFileName); if ( ($FILE cmp $NewFileName) == 0) { printf(" No need to rename: same name\n"); } else { if (! -f "$DIRECTORY\\$NewFileName") { if (! rename("$DIRECTORY\\$FILE","$DIRECTORY\\$NewFileName") ) { printf(" FAILED! $!"); } } else { printf("\tFile exists: $File::Find::name"); } printf("\n"); } # } } no warnings 'File::Find'; # Why isnt this working? find(\&ConvertToISO9660, @directories_to_search);