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

perladdict has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks, Below is the code i am trying to list the filnames in a directory
#!/usr/bin/perl $dir = "C:\\Users\\user\\Desktop\\test"; opendir DIR, $dir or die "error: cannot open directory \"$dir\" $!"; @files = sort grep (!/^\.$|^\.\.$/, readdir(DIR)); closedir (DIR); print "@files\n";
Once after listing all the filenames, i need validate each of the filenames should note exceed 8 characters. If files names which is having 8 characters and less than 8 characters i need to remove last charecter from each of the file names and prefix it with character "A"
All the filenames having .doc extention,below are the sample files names in a folder.
PBILLSTA.doc PBGISCTX.doc BGISCTXL.doc P537_LC.doc AODG.doc MAD004PN.doc
Please advice me, which perl fucntion i need to use in order to remove last charecters from the filename if it is having 8 characters and prefix the filename with character "A"
For the filenames which is having less than 8 charecters i just need to prefix "A" to each without removing last character.
  • Comment on I have a folder which is having 1200 files,all the file names are have maximum of 8 character length.I need to remove last character from each of the filnames and prefix it with character "A"
  • Select or Download Code
  • Watch for: Direct replies / Any replies

Replies are listed 'Best First'.
Re: I have a folder which is having 1200 files,all the file names are have maximum of 8 character length.I need to remove last character from each of the filnames and prefix it with character "A"
by MidLifeXis (Monsignor) on Feb 20, 2013 at 18:38 UTC

    See rename, split, join, length, and substr for some ideas. You may also want to see -e to check if a file or directory exists. Before using rename, you will likely want to do a test run with just printing.

    --MidLifeXis

      Thanks MidLifeXis, As per your inputs i have tried to implement this,Below is the code i tried it,i am able to succeed to rename all tons of files in my directory.
      #!/usr/bin/perl $dir = "C:\\Users\\user\\Desktop\\test"; opendir DIR, $dir or die "error: cannot open directory \"$dir\" $!"; @files = sort grep (!/^\.$|^\.\.$/, readdir(DIR)); closedir (DIR); foreach $fl(@files) { if($fl =~ m/\.doc/) { @a = split(/\.doc/,$fl); foreach $len(@a) { $z = length $len; if($len <= $z) { @x = substr($len,0,7); foreach $mod(@x) { $mod = "A".$mod.".doc"; rename $fl,$mod; } } } } }

        Grep pattern used for getting files can be modified to reduce the for loop iteration as you're going to rename only file names which are less than or equal to 8 characters with .doc extension.

        @files = sort grep /^.{1,8}\.doc$/, readdir(DIR);
Re: I have a folder which is having 1200 files,all the file names are have maximum of 8 character length.I need to remove last character from each of the filnames and prefix it with character "A"
by SuicideJunkie (Vicar) on Feb 20, 2013 at 18:44 UTC

    That could also be a job for a regular expression.

    Capture up to 7 symbols, then have an optional single symbol, then capture a literal dot and up to three more characters. Then rename the file to 'A' . $1 . $2

    The last step is to realize that things have gone horribly wrong with your requirements as stated, when you notice that you are not guaranteed to have unique filenames after losing the last letter, and files start conflicting with each other.

Re: I have a folder which is having 1200 files,all the file names are have maximum of 8 character length.I need to remove last character from each of the filnames and prefix it with character "A"
by moritz (Cardinal) on Feb 20, 2013 at 20:13 UTC