Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: renaming all files in a directory

by CountZero (Bishop)
on Jun 11, 2012 at 08:50 UTC ( [id://975520]=note: print w/replies, xml ) Need Help??


in reply to renaming all files in a directory

Do you think that putting the new filename into the variable $filename will magically change the name of the file on your harddisk?

Have a look at File::Copy, more especially the move function.

CountZero

A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

My blog: Imperial Deltronics

Replies are listed 'Best First'.
Re^2: renaming all files in a directory
by Aldebaran (Curate) on Jun 11, 2012 at 21:10 UTC

    When you ask the question like that, no, but I've made strides:

    $ perl mpj4.pl file: /home/dan/Desktop/upload/382432_10150873103536275_1105470601_n.j +pg ext: jpg filename: /home/dan/Desktop/upload/image_1.jpg file: /home/dan/Desktop/upload/542274_470102786337441_1974797173_n.jpg ext: jpg filename: /home/dan/Desktop/upload/image_2.jpg file: /home/dan/Desktop/upload/safe_image.php.jpeg ext: jpeg filename: /home/dan/Desktop/upload/image_3.jpeg $ cat mpj4.pl #!/usr/bin/perl -w use strict; my $path = '/home/dan/Desktop/upload/'; my @files = <$path*>; my $counter = 0; for my $img (@files) { $counter++; print "file: $img\n"; my $ext = ($img =~ m/([^.]+)$/)[0]; print "ext: $ext\n"; my $filename = "$path" . "image_". "$counter" . '.' . "$ext"; print "filename: $filename\n"; rename ($img, $filename) or warn "couldn't rename $img to $filename: + $!\n"; } $

    The situation that was really throwing me for a loop was that I'd write something to rename things, and then they'd all disappear. Until I put the asterisk in the diamond brackets, the directory did too! From what I read last night, this is something that happens to every perl learner at some point. I'm sure there's other ways of doing this, and I'd love to see them. I'll take a look a look at File::Copy when I get back to it.

    I wanted to say a few words on where I'm going with this. I want to combine these scripts so as to have a directory that has renamed images, but with the correct extension:

    $ perl lh1.pl downloaded 4 images from https://sites.google.com/site/lutherhavennm/m +ission to folder site_8 $ cat lh1.pl #!/usr/bin/perl -w # creates a new directory and downloads images from url to it # perlmonks node 965537; thx aaron and A.M. use strict; use feature ':5.10'; use WWW::Mechanize; use LWP::Simple; use Errno qw[ EEXIST ]; # get information about images my $domain = 'https://sites.google.com/site/lutherhavennm/mission'; my $m = WWW::Mechanize->new(); $m->get($domain); my @list = $m->images(); # create new folder and download images to it. my $counter = 0; my $dir = &mk_new_dir; for my $img (@list) { my $url = $img->url_abs(); $counter++; my $filename = $dir . "/image_" . $counter; getstore( $url, $filename ) or die "Can't download '$url': $@\n"; } # output print "downloaded ", $counter, " images from ", $domain, "\n"; print "to folder ", $dir, "\n"; sub mk_new_dir { my $counter2 = 1; while (1) { my $word = "site"; my $name = $word . '_' . $counter2++; if ( mkdir $name, 0755 ) { return $name; # success, return new dir name } else { next if $!{EEXIST}; # mkdir failed because file exists die sprintf "(%d) %s", $!, $!; # other failure; bail ou +t! } } } $

    After that, I want to create an html file that will have the stubouts for these images and their caption, but that has to be tomorrow. Cheers,

      An alternative way to make the "next" directory:
      use Modern::Perl; use File::Find::Rule; my $directory = 'c:/data/strawberry-perl/perl/script-chrome'; my $dir_pattern = 'test_'; my $next = ( sort { $b <=> $a } map { /(\d+)$/; $1 } File::Find::Rule->directory ->name( "$dir_pattern*" ) ->in( $directory ) )[0] + 1; mkdir "$directory/$dir_pattern$next", 0755 or die "Could not make dire +ctory $directory/$dir_pattern$next";

      CountZero

      A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

      My blog: Imperial Deltronics

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others rifling through the Monastery: (4)
As of 2024-04-24 20:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found