Linux - Newbie This Linux forum is for members that are new to Linux.
Just starting out and have a question?
If it is not in the man pages or the how-to's this is the place! |
| Notices |
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
Are you new to LinuxQuestions.org? Visit the following links:
Site Howto |
Site FAQ |
Sitemap |
Register Now
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
 |
GNU/Linux Basic Guide
This 255-page guide will provide you with the keys to understand the philosophy of free software, teach you how to use and handle it, and give you the tools required to move easily in the world of GNU/Linux. Many users and administrators will be taking their first steps with this GNU/Linux Basic guide and it will show you how to approach and solve the problems you encounter.
Click Here to receive this Complete Guide absolutely free. |
|
 |
|
07-13-2006, 08:58 PM
|
#1
|
|
Member
Registered: Mar 2005
Posts: 206
Rep:
|
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?
|
|
|
|
07-13-2006, 09:04 PM
|
#2
|
|
Member
Registered: Feb 2005
Location: San Antonio, TX
Distribution: Gentoo
Posts: 684
Rep:
|
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
|
|
|
|
07-13-2006, 09:08 PM
|
#3
|
|
Member
Registered: Oct 2004
Posts: 215
Rep:
|
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.
|
|
|
|
07-14-2006, 02:41 AM
|
#4
|
|
Member
Registered: Mar 2005
Posts: 206
Original Poster
Rep:
|
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.
|
|
|
|
07-14-2006, 02:59 AM
|
#5
|
|
Moderator
Registered: Aug 2001
Location: Fargo, ND
Distribution: SuSE AMD64
Posts: 15,733
|
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
Last edited by jschiwal; 07-14-2006 at 03:00 AM.
|
|
|
|
07-14-2006, 07:23 PM
|
#6
|
|
Member
Registered: Oct 2004
Posts: 215
Rep:
|
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)
|
|
|
|
07-15-2006, 12:01 AM
|
#7
|
|
Senior Member
Registered: Oct 2003
Posts: 3,057
Rep:
|
Quote:
|
newfilename = filename.replace(' ', '_')
|
I wonder what's the python method for converting upper to lower?
|
|
|
|
07-15-2006, 12:26 AM
|
#8
|
|
Member
Registered: Oct 2004
Posts: 215
Rep:
|
str.uppper() or str.lower(), where str is a string object. Take a look at this link for quick details.
|
|
|
|
07-15-2006, 01:14 AM
|
#9
|
|
Senior Member
Registered: Oct 2003
Posts: 3,057
Rep:
|
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)
|
|
|
|
07-15-2006, 01:17 AM
|
#10
|
|
Member
Registered: Oct 2004
Posts: 215
Rep:
|
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.
|
|
|
|
07-15-2006, 02:22 AM
|
#11
|
|
Member
Registered: Oct 2004
Posts: 215
Rep:
|
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.
|
|
|
|
07-15-2006, 06:46 AM
|
#12
|
|
Senior Member
Registered: Oct 2003
Posts: 3,057
Rep:
|
That works also! Thanks 
|
|
|
|
07-15-2006, 08:32 AM
|
#13
|
|
Senior Member
Registered: Oct 2003
Posts: 3,057
Rep:
|
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')
|
|
|
|
07-15-2006, 01:14 PM
|
#14
|
|
Member
Registered: Oct 2004
Posts: 215
Rep:
|
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.
|
|
|
|
07-15-2006, 01:27 PM
|
#15
|
|
Senior Member
Registered: Oct 2003
Posts: 3,057
Rep:
|
Thanks, that works.
I had tried it with just ./myscript images without the /*
|
|
|
|
| Thread Tools |
Search this Thread |
|
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -5. The time now is 04:10 AM.
|
|
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.
|
Latest Threads
LQ News
|
|