Visit Our UNIX and Linux User Community


changing filenames in a directory to a number within a loop


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting changing filenames in a directory to a number within a loop
# 1  
Old 12-07-2007
changing filenames in a directory to a number within a loop

hey guys. i'm new to shell scripting but not new to programming. i want to write a script that will take all the files in the current directory that end with a particular filetype and change all their names to a number in order. so, it would take all the jpg files and sort them in alphabetical order, then it would change their names from 1 all the way up to the end, so maybe 36 or something. whatever, until there's no more image files. this sounds like it would be a simple and short script to write, but i have no idea where to start. can anyone help me, or direct me to a similar script so i can hack it? thanks
# 2  
Old 12-07-2007
Here is a simple model to try -
Code:
#!/bin/ksh
extension=$1
let i=1
cd /path/to/somewhere
for file in `ls *.$extension`
do
      mv $file $i.$extension
      let i=$i+1
done

usage: myscript.sh jpg
# 3  
Old 12-07-2007
i see. so what's the $1 for? does the shell recognize that as the last characters after the last dot '.' in a filename?

also, i just want it to work for the current directory. so no reason to have a path. i guess you could, but just make it something like '$path = pwd' or something. would that work? i was thinking of using a for loop but this looks much simpler and less lines of code. i thought there would be regex involved or sed or something more complex so that it would only work on a few filetypes (images). i'd like to just type in the command while i'm in the directory i want to change and have it do it without typing in any other commands or options or parameters. what do you think?

btw i use zsh. that shouldn't make any difference right?
# 4  
Old 12-07-2007
You said you wanted the list sorted alphabetically:

Code:
for file in $(ls *.$extension | sort); do ...

To answer your questions:
- $1 is a positional parameter. Arguments given to a script will be placed into $1, $2, etc.
- You can certainly work in whatever directory you choose, but "$path" does nothing and "$PATH" is something else entirely. Just leave out the "cd" command to work in the current directory.
- If you don't want to include any other arguments, then simply hard-code the value of $extension. (hard-code? *cough*)

Welcome to the wide world of shell scripting!

Last edited by gus2000; 12-07-2007 at 10:45 PM..
# 5  
Old 12-07-2007
bash: ( *$filetype GLOB is expanded to an alphabetic list )

Code:
filetype="jpg"
list=( *.$filetype )
for (( i = 0 ; i < ${#list[*]} ; )) ; do 
    mv ${list[$i]} $((++i)).$filetype
done


Last edited by reborg; 12-07-2007 at 08:53 PM..
# 6  
Old 12-07-2007
thank you for the great replies. so this is how i think it should go. the logic is there i suppose but the syntax is way off. i'm trying to create this script to work under any conditions (in any directory) and not tamper with anything but. so, i threw in a little regex, and even that is probably off, but it's to help me sleep at night. how does this look to you guys?
Code:
regex = '/[jpg]$/'
filetype = '.jpg'
list = (ls | grep $regex)
for (( i = 0 ; i < ${#list[*]} ; i++ )) ; do 
    mv ${list[$i]} $((++i)).$filetype
done

# 7  
Old 12-11-2007
i tried yours, reborg, and it kinda messed me up a little.

Code:
kumi@throne:atlas/images/photos % sudo chmod a+x gallery
kumi@throne:atlas/images/photos % ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  1.jpg   21.jpg  23.jpg  25.jpg  27.jpg  29.jpg  30.jpg  32.jpg  34.jpg  36.jpg  4.jpg  6.jpg  8.jpg  gallery*
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  20.jpg  22.jpg  24.jpg  26.jpg  28.jpg  2.jpg   31.jpg  33.jpg  35.jpg  3.jpg   5.jpg  7.jpg  9.jpg
kumi@throne:atlas/images/photos % ./gallery 
mv: overwrite `1.jpg', overriding mode 0644? y
mv: cannot move `10.jpg' to `1.jpg': Permission denied
mv: overwrite `2.jpg', overriding mode 0644? 
kumi@throne:atlas/images/photos % sudo ./gallery 
kumi@throne:atlas/images/photos % ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  20.jpg  22.jpg  24.jpg  26.jpg  28.jpg  30.jpg  32.jpg  34.jpg  36.jpg
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  21.jpg  23.jpg  25.jpg  27.jpg  29.jpg  31.jpg  33.jpg  35.jpg  gallery*

as you can see, i lost 10 photos. why?

Previous Thread | Next Thread
Test Your Knowledge in Computers #842
Difficulty: Medium
HTTP server push (also known as HTTP streaming) is a mechanism for sending unsolicited (asynchronous) data from a web server to a web browser.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

For/While Loop to Increment Filenames in a Script

Daily stupid question. I want to increment the file name everytime the script is run. So for example if the filename is manager.log and I run the script, I want the next sequence to be manager.log1. So to be clear I only want it to increment when the script is executed. So ./script... (10 Replies)
Discussion started by: metallica1973
10 Replies

2. UNIX for Dummies Questions & Answers

[Solved] Writing a loop to changing the names of files in a directory

Hi, I would like to write a loop to change the names of files in a directory. The files are called data1.txt through data1000.txt. I'd like to change their names to a1.txt through a1000.txt. How do I go about doing that? Thanks! (2 Replies)
Discussion started by: evelibertine
2 Replies

3. Shell Programming and Scripting

Generate filenames in a loop

Hi all, I want to generate output files in a loop, run the same command on the same input file 1000 times and output in files with a new name each time, maybe a number appended to it. The output will be different each time as I`m sampling randomly from the input file. I want to do the... (3 Replies)
Discussion started by: newbie83
3 Replies

4. UNIX and Linux Applications

Firefox changing hidden filenames

Is firefox changing the filename of this hidden file for anyone else? I tried in firefox 3, 4, and 6. They all got changed when I tried when I downloaded the file. Firefox removed the leading dot that makes the file be hidden. MEGAUPLOAD - The leading online storage and file delivery service (2 Replies)
Discussion started by: cokedude
2 Replies

5. Shell Programming and Scripting

changing number in bash (number is in form of string)

I have a txt file as database. when i run my program what it does is it ask me for 3 name and stored in the file as name1:name2:name3:1 when u enter 3 name it add those in file as above format and add 1 at the end. I what i want is if i enter same names again it changes that 1 to 2 and so... (3 Replies)
Discussion started by: Learnerabc
3 Replies

6. Shell Programming and Scripting

Whitespace in filenames in for loop in bash script

I'm trying to search all .odt files in a directory for a string in the text of the file. I've found a bash script that works, except that it can't handle whitespace in the filenames. #!/bin/bash if ; then echo "Usage: searchodt searchterm" exit 1 fi for file in $(ls *.odt); do ... (4 Replies)
Discussion started by: triplemaya
4 Replies

7. Shell Programming and Scripting

loop through numbered filenames

Hi I'm very new to this script thing, so please be gentle. I am trying to get a command - the mach2qtl command in the code below - to loop through a set of files. Each command should take the same two .dat and .ped files, but the .mlinfo and .mlprob files with filenames including 'chrom1' ... (7 Replies)
Discussion started by: polly_falconer
7 Replies

8. Shell Programming and Scripting

Help with how to account for changing filenames

The files below are essentially “lookup files” used in a series of scripts that run through the look up files and grab the correct Group Name and File Type and then unless I have the file name specified will replace the variable with the corresponding group name when processing the files before... (1 Reply)
Discussion started by: defiant82
1 Replies

9. UNIX for Dummies Questions & Answers

extracting and using date from filenames in a loop

HIya, Having a dumb day whilst writing an archive process in Shell want to extract from the filename the date and archive into tar files based on this, I don't want to use mtime as it may not be the actual file date. The files are -rw-rw---- 1 user admin 100 Aug 29 11:10... (2 Replies)
Discussion started by: badg3r
2 Replies

10. UNIX for Dummies Questions & Answers

Appending text to a number of similar filenames

Hi, I was wondering if there was a way to append something to filenames based on a wildcard. For example, if I have the following files in a directory: blah1 blah2 blah3 blah4 blah5 I want to rename these all to: blah1.txt blah2.txt blah3.txt blah4.txt blah5.txt Is there a... (4 Replies)
Discussion started by: Djaunl
4 Replies

Featured Tech Videos