#!/usr/bin/perl use strict; use warnings; # # Duplicate a directory structure onto a second directory tree # # # $source_dirname = "C:\Files"; # $target_dirname = "D:\Files"; # Usage: copy_struct( $source_dirname, $target_dirname, $verbose_mode ); # # Verbose 0 => Quiet Mode # 1 => Show created folders # 2 => Full diagnostics # print "Copy_struct Version 0.0.2\n"; if ( $#ARGV > -1 ) { my $verbose_mode = 1; print ©_struct( $ARGV[0], $ARGV[1], $verbose_mode ) . " directories created."; } # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # sub copy_struct # # Duplicate directory structure found in source into target, (recursively # (recursively (recursively... ))) including all folders in tree below. # { # Store passed parameters my ($source_dirname, $target_dirname, $verbose) = @_; print "Checking folder '" . $source_dirname . "'... \n" if ( $verbose > 2); # Define local variables my ($dirname, $new_dir, $anyfound, $file, $dir, $msg); # Open the directory opendir($dir, $source_dirname ) || print "Error: Unable to open directory $dirname . $!\n"; $anyfound=0; foreach $file (sort(readdir($dir))) { # Create working name for folder $dirname = $source_dirname . "/" . $file; # Loop through the tree, skipping . and .. extries if ( ( -d $dirname) && ($file ne ".") && ($file ne "..") ) { # It's a directory, create in target print " Checking entry " . $dirname . "\n" if ( $verbose > 1); $new_dir = $target_dirname . "/" . $file; # Does it exist as a file? if ( ( -e $new_dir ) && (!(-d $new_dir )) ) { # Throw error $msg = "Directory $new_dir already exists as a file!!!"; print $msg . "\n"; # $i=Win32::MsgBox( $msg, 0, $0 ); } # Does it exist as a directory? if ( !( -d $new_dir)) { # Doesn't exist, create it $anyfound++; if ( mkdir( $new_dir ) ) { print " " . $dirname . " created.\n" if ( $verbose == 1); } } # Recurse to anything in this directory $anyfound += ©_struct($dirname, $new_dir, $verbose); } } # Close the directory closedir($dir); return( $anyfound ); }