LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Newbie (http://www.linuxquestions.org/questions/linux-newbie-8/)
-   -   how do i convert file names to lower case and remove the underscore from the name? (http://www.linuxquestions.org/questions/linux-newbie-8/how-do-i-convert-file-names-to-lower-case-and-remove-the-underscore-from-the-name-463841/)

asilentmurmur 07-13-2006 09:58 PM

how do i convert file names to lower case and remove the underscore from the name?
 
Hey everyone

do any of you know how to convert a set of file names in a directory, to lowercase and remove the underscores from their names? Is there a special shell script i could use or a special command? also how do i go about running it?

alunduil 07-13-2006 10:04 PM

Here you go:

Code:

for i in *; do mv "$i" "$(echo $i | tr '_' '')"; done
for i in *; do mv "$i" "$(echo $i | tr '[A-Z]' '[a-z]')"; done

That will get you started.

Regards,

Alunduil

bushidozen 07-13-2006 10:08 PM

To convert underscores to spaces:
If you have python installed on your computer, this script will do it:
Code:

#!/usr/bin/python
# the following script will traverse through all of the files
# within the directory where it is placed and replace each
# underscore within the filename with a space

import os, sys
if len(sys.argv) == 1:
    filenames = os.listdir(os.curdir)
else:
    filenames = sys.argv[1:]
for filename in filenames:
    if '_' in filename:
        newfilename = filename.replace('_', ' ')
        print "Renaming", filename, "to", newfilename, "..."
        os.rename(filename, newfilename)

just copy and paste the above in a text file and make it executable. Then place it in the directory with the files you wish to change and click it. All of the underscores will convert to spaces. This code is runs faster than a comparable bash shell script and runs on windows (with python installed) too.

I will get back to you for converting to lower case.

asilentmurmur 07-14-2006 03:41 AM

awesome it worked thanks man! Do you know of any scripts that will remove spaces from filenames? I need my set of file names to have no spaces.

jschiwal 07-14-2006 03:59 AM

A common way of replacing characters in the shell is to use variable expansion.
For example: "${filename// /_}" will replace all spaces in "$filename" with underscores. The "//" doubleslash will do it globally in the variable, and not the first one.
"${filename// /}" will remove spaces. You can use character classes as well:
"${filename//[ _]/}". This will remove all spaces and underscores.

Combining this with the earlier post:
for i in *; do mv "$i" "$(echo ${i//_/} | tr '[A-Z]' '[a-z]')"; done

bushidozen 07-14-2006 08:23 PM

You can slightly modify the python code I gave you above:
Code:

#!/usr/bin/python
# the following script will traverse through all of the files
# within the directory where it is placed and replace each
# space within the filename with an underscore

import os, sys
if len(sys.argv) == 1:
    filenames = os.listdir(os.curdir)
else:
    filenames = sys.argv[1:]
for filename in filenames:
    if ' ' in filename:
        newfilename = filename.replace(' ', '_')
        print "Renaming", filename, "to", newfilename, "..."
        os.rename(filename, newfilename)


homey 07-15-2006 01:01 AM

Quote:

newfilename = filename.replace(' ', '_')
I wonder what's the python method for converting upper to lower?

bushidozen 07-15-2006 01:26 AM

str.uppper() or str.lower(), where str is a string object. Take a look at this link for quick details.

homey 07-15-2006 02:14 AM

Do I need two if statements or can it be shortened?
Code:

#!/usr/bin/env python

# Replace upper case with lower case
# Replace spaces with underscores

import os, sys
if len(sys.argv) == 1:
    filenames = os.listdir(os.curdir)
else:
    filenames = sys.argv[1:]
for filename in filenames:
    if filename.upper():
        newfilename = filename.lower()
    if ' ' in newfilename:
        newfilename = newfilename.replace(' ', '_')
        print "Renaming", filename, "to", newfilename, "..."
        os.rename(filename, newfilename)


bushidozen 07-15-2006 02:17 AM

It could be shortened, but I think that would make it take longer to run. I think it's fine as it is. It is a little more robust, and is easier to debug or change if necessary.

bushidozen 07-15-2006 03:22 AM

I just looked over your code, and I saw a couple of errors, so I rewrote it a little:
Code:

#!/usr/bin/python

# Replace upper case with lower case
# Replace spaces with underscores

import os, sys
if len(sys.argv) == 1:
    filenames = os.listdir(os.curdir)
else:
    filenames = sys.argv[1:]
for filename in filenames:
    newfilename = filename.lower()
    if ' ' in newfilename:
        newfilename = newfilename.replace(' ', '_')
        print "Renaming", filename, "to", newfilename, "..."
    os.rename(filename, newfilename)

This code will attempt to convert all filenames to lowercase (even those that are already lowercase), which could translate into a lot of wasted cycles (ie. if all of the files in the directory are already lowercase), but it actually runs faster than trying to determine its case as in the previous code (by using the if statement). Enjoy.

homey 07-15-2006 07:46 AM

That works also! Thanks :)

homey 07-15-2006 09:32 AM

Stuck again! :)
I want to choose the directory and not sure how. This doesn't seem to work for /home/images
Code:

    filenames = os.listdir('images')

bushidozen 07-15-2006 02:14 PM

It already does that (almost). Just run the script followed by the directory path and the files in the directory you wish to change.

Example: Let's say you have a folder in you home directory called "folder" in it you have three files: ONE 1.txt, TWO 2.txt, and THREE 3.txt. We'll call your script "myscript", and it is located in your home directory.

To change the file ONE 1.txt, run:
Code:

$ myscript folder/ONE 1.txt
$ ls folder
one_1.txt TWO 2.txt THREE 3.txt

To change all of the files, run:
Code:

$ myscript folder/*
$ ls folder
one_1.txt two_2.txt three_3.txt

Or, you could place the script in /home/bin, and simply cd to a directory and run it.

homey 07-15-2006 02:27 PM

Quote:

myscript folder/*
Thanks, that works.
I had tried it with just ./myscript images without the /*


All times are GMT -5. The time now is 10:49 PM.