#!/usr/bin/perl use File::Path; use File::Copy; if (!defined $ARGV[0]){ print "Incorrect Usage\n"; print "reorgdir.pl [basedirectory] [(optional)subdir1,subdir2...]\n"; print "Exiting. \n"; exit (1); } $baseDir = $ARGV[0]; $subDirExplicit = $ARGV[1]; # OPEN THE BASE DIR opendir(BASEDIR, $baseDir) or die "$baseDir: $!\n"; # TWO DIFFERENT OPTIONS, EITHER SUBDIRECTORIES WERE EXPLICITY STATED # AS PARAMETERS AT THE COMMAND LINE AND WILL READ THOSE SUBDIRECTORIES ONLY, # OR WILL SEARCH FOR ALL SUBDIRECTORIES IN BASEDIR AND FILTER THOSE. # EXCLUDES THE FOLLOWING DIRECTORIES AUTOMATICALLY: ., .., LOST + FOUND if ($subDirExplicit ne ""){ print "\n Filtering Explicit Directories \n"; # CODE HERE FOR EXPLICIT DIR STATING }else { # READ IN THE SUBDIRECTORIES LISTED IN THE BASEDIR THAT WILL BE FILTERED # AND PUT INTO AN ARRAY while (defined($subDir = readdir(BASEDIR))){ if (($subDir !~ m/\./) && ($subDir !~ m/.*lost.*found.*/)){ push @subDirArray, $subDir; }else { print "Excluded Directories: $subDir\n"; } } # SORT THE subDirArray Array @subDirArray = sort @subDirArray; # CALL THE FILTER FUNCTION FOR EACH VALID SUBDIR foreach $dir (@subDirArray){ &filterSubDirectory($baseDir,$dir); } } sub filterSubDirectory($baseDir, $dir){ my $baseDirName = $baseDir; my $subDirName = $dir; # CREATE DIRECTORY BY APPENDING BASE AND SUB $directoryToFilter = $baseDirName . "/" . $subDirName; # OPEN SUBDIR AND READ FILES if (opendir(SUBDIR, $directoryToFilter)){ while (defined($subDirFiles = readdir(SUBDIR))){ # @threePart contains files with scrp?_XXXXXX_YYY.jpg/tif # @twoPart contains file with scrp?_XXXXXX.jpg/tif if($subDirFiles =~ m/scrp\d{1}_\d{6}_\d{3}\.[jpg|tif]/){ push @threePart, $subDirFiles; }elsif($subDirFiles =~ m/scrp\d{1}_\d{6}\.[jpg|tif]/){ push @twoPart, $subDirFiles; } } @threePart = sort(@threePart); foreach $curFile (@threePart){ if ($curFile =~ m/scrp\d{1}_(\d{6})_(\d{3})\.(jpg|tif)/){ $newDir = $1; $newFileName = $2; $ext = $3; # CHECK IF NEW DIRECTORY HAS ALREADY BEEN CREATED # SINCE ARRAY CONTAINING IMAGES HAS BEEN ORDERED WE CAN INFER # IF THE DIRECTORY EXISTS BY CHECKING IF THE PREVIOUS VALUE IN THE # ARRAY IS EQUAL TO THE CURRENT VALUE IN THE ARRAY. IF IT IS NOT, THEN # THE DIRECTORY DOES NOT EXIST, AND WE SHOULD CREATE IT. if ($newDir ne $oldDir){ $dirToCreate = $baseDir . "/" . "scrpbk" . $newDir; print "New Directory is $dirToCreate and contains: \n"; mkpath(['$newDir'],1,777); $oldDir = $newDir; } # COPY THE FILE TO THE NEW DIRECTORY AND RENAME IT ACCORDINGLY $curFileLoc = $baseDir . "/" . $dir . "/" . $curFile; $newFileLoc = $dirToCreate . "/0" . $newFileName . "." . $ext; print " $curFileLoc --> $newFileLoc\n"; copy(["$curFileLoc", "$newFileLoc"]); } } # ZERO OUT FILE INFORMATION VARIABLES TO PREVENT DISCREPANCIES $curFile = ""; $oldDir = ""; $newDir = ""; $newFileName = ""; $ext = ""; # SORT THE TWO PART ARRAY @twoPart = sort(@twoPart); foreach $curFile (@twoPart){ if($curFile =~ m/scrp(\d{1})_(\d{6})\.(jpg|tif)/){ $newDir1 = $1; $newDir2 = $2; $newDir = $newDir1 . $newDir2; $ext = $3; # CHECK IF NEW DIRECTORY HAS ALREADY BEEN CREATED # SINCE ARRAY CONTAINING IMAGES HAS BEEN ORDERED WE CAN INFER # IF THE DIRECTORY EXISTS BY CHECKING IF THE PREVIOUS VALUE IN THE # ARRAY IS EQUAL TO THE CURRENT VALUE IN THE ARRAY. IF IT IS NOT, THEN # THE DIRECTORY DOES NOT EXIST, AND WE SHOULD CREATE IT. if ($newDir ne $oldDir){ $dirToCreate = $baseDir . "/" . "scrpbk" . $newDir; print "New Directory is $dirToCreate and contains: \n"; mkpath(['$newDir'],1,777); $oldDir = $newDir; } # COPY THE FILE TO THE NEW DIRECTORY AND RENAME IT ACCORDINGLY $curFileLoc = $baseDir . "/" . $dir . "/" . $curFile; $newFileLoc = $dirToCreate . "/0" . $newDir2 . "." . $ext; print " $curFileLoc --> $newFileLoc\n"; copy(["$curFileLoc", "$newFileLoc"]); } } # ZERO OUT FILE INFORMATION VARIABLES TO PREVENT DISCREPANCIES $curFile = ""; $oldDir = ""; $newDir = ""; $newFileName = ""; $ext = ""; # ZERO OUT FILE ARRAYS FOR NEXT SUBDIR ITERATION @threePart = ""; @twoPart = ""; } }