Help - Search - Members - Calendar
Full Version: Moving Groups Of Files From Upper To Low
Linuxhelp > Support > Tips and Tricks
Corey
Often times when you transfer files from Windows to Linux, they end up with all Capital letters. While generally, this isn't much of a problem, sometimes this includes large directories and Linux will not see "FILENAME.EXE" the same as "filename.exe". The solution is to issue the following perl command to rename everything in a directory from upper to lower case:

QUOTE
perl -le 'rename $_, lc( $_ ) foreach <*>'


This "tip" is available through the random tip son the linuxhelp.ca frontpage.
Hemant
just a suggestion...
We should also explain the tricks
hughesjr
Ok ... here is the explaination:

PERL is magic laugh.gif
----------------------
Actually, the perl -l is to run perl, -e switch allows you to execute the information inside the quotes with the perl interpretor ... it's like running a perl script that contains the information inside the quotes ... in this case the perl command that is executed is: rename $_, lc( $_ ) foreach <*>

$_ (in perl) is the topic ... which in generic terms means the currently selected item...if you want a more detailed explaination of topic, see this. In this code, the topic is going to be a filename.

lc() is a function in perl to convert text to lowercase ... in this example, it converts $_ (the filename) to lowercase.

rename x,y in perl will rename file x to the name y ... it is very similar to the command mv in bash (except there is a comma between filenames). In this case $_ (the original filename) is renamed to lc($_) the lowercase filename.

foreach defines a list of items to do sometime on ... in this case <*> will generate a list including all files in a directory...try this command to see a list of all the files in a directory: perl -le 'print $_ foreach <*>'

So, put it all together and perl -le 'rename $_, lc( $_ ) foreach <*>' will convert all filenames in a directory to thier lowercase equivalant.

I actually know a little bit about perl ... see my old website ... which I haven't updated since 1999 (i think) ... I don't even know the passwords to make changes to the site anymore....(WOW what a flashback!)
Hemant
Yeah..Thanks for explanation...i have checked your site also...
interesting....
hughesjr
Just so everyone knows ... I was an NT and UNIX guy back in 1999 (I was just playing around with Linux on a webserver or 2 back then)...I am a Linux guy now! laugh.gif

(Like I said before...I haven't changed that site since 1999).
-----------------------------------------------
And now, back on topic:

For anyone who would rather convert upper to lower case with a shell script...here it is (I named it lowerit.sh):

CODE
#!/bin/sh
# lowerit
# convert all file names in the current directory to lower case
# only operates on plain files--does not change the name of directories
# will ask for verification before overwriting an existing file
for x in `ls`
do
  if [ ! -f $x ]; then
    continue
  fi
  lc=`echo $x  | tr '[A-Z]' '[a-z]'`
  if [ $lc != $x ]; then
        mv -i $x $lc
  fi
done
# End of lowerit script


The above file needs to be in the directory you want to change files in ... and it won't currently do files that start with a . (like .Abc123Z) won't get converted ... because most . files are setup files and you don't want to change their case. If you do want to also change the case of . files, change the line for x in `ls` to for x in `ls -a`
Hemant
How about renaming whole filename from uppercase to lowercase..here is a solution using gawk..
$ ls -l|awk `{printf("mv %s %sn",$9,totupper($9))|"/bin/bash"}`
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2017 Invision Power Services, Inc.