http://www.perlmonks.org?node_id=1022845


in reply to Re: Transforming File Name Characters
in thread Transforming File Name Characters

We need to remove all / \ } { & $ # @ ~ ` pretty much anything that is NOT a letter or a number.

  • Comment on Re^2: Transforming File Name Characters

Replies are listed 'Best First'.
Re^3: Transforming File Name Characters
by choroba (Cardinal) on Mar 11, 2013 at 21:24 UTC
    You can try something along the following lines:
    fixdir('d'); sub fixdir { my $dir = shift; opendir my $DH, $dir or die "$dir: $!"; while (my $f = readdir $DH) { next if grep $_ eq $f, qw/. ../; (my $new = $f) =~ s/[^a-zA-Z0-9_.]/_/g; die "$f: $new already exists.\n" if -e "$dir/$new" and $new ne + $f; print STDERR "Renaming: $f -> $new\n"; rename "$dir/$f", "$dir/$new"; fixdir("$dir/$new") if -d "$dir/$new"; } }
    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
      WOW - Thank YOU !!!! :-)
      I have a question regarding this statement... sub fixdir { my $dir = shift; opendir my $DH, $dir or die "Not Found....$dir: $!"; while (my $f = readdir $DH) { next if grep $_ eq $f, qw/. ../; (my $new = $f) =~ s/[^a-zA-Z0-9_.]/_/g; next if ($new eq $f); <<<<<<<<<<<<< THIS ONE <<<<<<<<<<<< +<<<< while ( -e "$dir/$new") { $new.= "1"; } print STDERR "Renaming: $f -> $new\n"; rename "$dir/$f", "$dir/$new"; fixdir("$dir/$new") if -d "$dir/$new"; } } IF $f is the name of a directory and not a file won't that whole direc +tory get skipped????? Thanks -Ray
        Yes, you are right. You should only skip the renaming part, not the recursive one. This problem did not exist in my code, though (but something like unless $new eq $f should be appended to the rename).

        Also, please do not use <code> tags for normal text. It makes the code harder to download.

        لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
      Hello, This is my revised code. can anyone spot any blaring error??
      #!/usr/local/ActivePerl-5.16/bin/perl use POSIX qw/strftime/; use strict; use warnings; use diagnostics; sub fixdir { my $dir = shift; opendir my $DH, $dir or die "Not Found....$dir: $!"; while (my $f = readdir $DH) { next if grep $_ eq $f, qw/. ../; (my $new = $f) =~ s/[^a-zA-Z0-9_.]/_/g; if (-e "$dir/$new") { fixdir("$dir/$new") if -d "$dir/$new"; next; } # next if ($new eq $f); while ( -e "$dir/$new") { $new.= "1"; } print STDERR "Renaming: $f -> $new\n"; rename "$dir/$f", "$dir/$new"; fixdir("$dir/$new") if -d "$dir/$new"; } } die "No command line arguments given!" unless @ARGV; my $nargs = @ARGV; print "Number of command line arguments is $nargs\n"; my $Do_Dir = $ARGV[0]; # print("ARG=", "$Do_Dir", "<<<<<<\n"); if (!$Do_Dir ) { print ("No Folder Name given!\n"); exit; } print( "The Folder Name is: ", "$Do_Dir", "\n" ); fixdir("$Do_Dir"); print "Done...\n"
      Thank you one and all for your help on this little project1

      Regards, -Ray

        If $dir/$new already exists, you do not rename it. That's not what I think you want. What about this:
        sub fixdir { my $dir = shift; opendir my $DH, $dir or die "Cannot open '$dir': $!"; while (my $f = readdir $DH) { next if grep $_ eq $f, qw/. ../; (my $new = $f) =~ s/[^a-zA-Z0-9_.]/_/g; if ($new ne $f) { $new .= '1' while -e "$dir/$new"; print STDERR "Renaming: $f -> $new\n"; rename "$dir/$f", "$dir/$new"; } fixdir("$dir/$new") if -d "$dir/$new"; } }
        لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ