Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^3: Transforming File Name Characters

by choroba (Canon)
on Mar 11, 2013 at 21:24 UTC ( #1022876=note: print w/ replies, xml ) Need Help??


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

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"; } }
لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ


Comment on Re^3: Transforming File Name Characters
Download Code
Replies are listed 'Best First'.
Re^4: Transforming File Name Characters
by rfleisch (Initiate) on Mar 12, 2013 at 12:10 UTC
    WOW - Thank YOU !!!! :-)
Re^4: Transforming File Name Characters
by rfleisch (Initiate) on Mar 14, 2013 at 17:53 UTC
    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.

      لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

        10-4 on only using the "code" tag for real code. I was using it for formatting. But if I understand your code correctly the script would "die" at the first duplicate, which I do NOT want it to do.

        -Regards, -Ray
Re^4: REVISED - Transforming File Name Characters
by rfleisch (Initiate) on Mar 14, 2013 at 19:24 UTC
    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"; } }
      لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
        And this is my FINAL results. I tested it on TWO LARGE folders and it worked great. And YES, I backed up first. :-)

        I thank you Sooooooooo Much

        -Regards -Ray
        #!/usr/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/. ../; fixdir("$dir/$f") if -d "$dir/$f"; (my $new = $f) =~ s/[^a-zA-Z0-9_.]/_/g; if ($new eq $f) { next; } while ( -e "$dir/$new") { $new .= "1"; } print STDERR "Renaming: $f -> $new\n"; rename "$dir/$f", "$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"

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1022876]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (8)
As of 2015-07-31 01:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (274 votes), past polls