Visit Our UNIX and Linux User Community


Rename all ".JPG" files to ".jpg" under all subfolders...


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Rename all ".JPG" files to ".jpg" under all subfolders...
# 1  
Old 04-25-2010
Rename all ".JPG" files to ".jpg" under all subfolders...

Hi, Dear all:

One question ! ^_^
I'm using bash under Ubuntu 9.10.

My question is not to rename all ".JPG" files to ".jpg" in a single folder, but to rename all ".JPG" files to ".jpg" in all subfolders.

To rename all ".JPG" to ".jpg" in a single folder,
Code:
for x in *.JPG; do mv "$x" "${x%.JPG}.jpg"; done

works fine for me.

But how to recursively enter every subfolder and rename all the files?
(Well, if possible, enter every subfolder's subfolder.. recursively?? )

In sum, given a folder, all files under this folder, and all its subfolder, and all the subsubfolders, should be finally renamed in one specific rule.

How to deal with it?

Thank you very much and looking forward to your reply.

Best Regards
JIA Pei

Last edited by pludi; 04-25-2010 at 01:39 PM.. Reason: code tags, please...
# 2  
Old 04-25-2010
I guess this is far from a professional solution, but it seems to work:
Code:
$ du -a
0	./001.JPG
0	./002.JPG
0	./img1/a.JPG
0	./img1/b.JPG
2	./img1
0	./img2/1.JPG
0	./img2/2.JPG
0	./img2/pic10/pic1.JPG
0	./img2/pic10/pic2.JPG
2	./img2/pic10
4	./img2
8	.
$ 
$ du -a | cut -d '/' -f2- | grep JPG
001.JPG
002.JPG
img1/a.JPG
img1/b.JPG
img2/1.JPG
img2/2.JPG
img2/pic10/pic1.JPG
img2/pic10/pic2.JPG
$ 
$ for x in `du -a | cut -d '/' -f2- | grep JPG`; do mv "$x" "${x%.JPG}.jpg"; done
$ du -a
0	./002.jpg
0	./img1/b.jpg
0	./img1/a.jpg
2	./img1
0	./img2/2.jpg
0	./img2/pic10/pic2.jpg
0	./img2/pic10/pic1.jpg
2	./img2/pic10
0	./img2/1.jpg
4	./img2
0	./001.jpg
8	.
$

# 3  
Old 04-25-2010
Another way:

Code:
find /your/folder -type f | sed 's/\(.*\)\.JPG/mv \1.JPG \1.jpg/' | sh

# 4  
Old 04-25-2010
Quote:
Originally Posted by verdepollo
Another way:

Code:
find /your/folder -type f | sed 's/\(.*\)\.JPG/mv \1.JPG \1.jpg/' | sh

That approach comes with hefty filename limitations (which may or may not be of importance to the original poster, but I'll mention them for completeness):

- Filenames cannot contain newlines (when reading find's output, it's impossible to distinguish between two filenames and one with an embedded newline. Unfixable.
- Filenames cannot contain any of the other shell-special characters (space, tab, backslash, single-quote, double-quote, semicolon, ampersand, pipe, >, <, etc). Possibly fixable, by backslash escaping every such character, but it would be a brittle solution.

Unrelatedly, either find should be constrained to match only files ending in ".JPG" or the matching regular expression in sed should be anchored to the end of the line, with "JPG$". Otherwise, mid-filename ".JPG" sequences will match filenames not ending in ".JPG".

Regards,
Alister

---------- Post updated at 02:26 PM ---------- Previous update was at 01:52 PM ----------

If the solution must handle every allowable filename, I would suggest:
Code:
find . -type f -name \*.JPG -exec ./mvjpg.sh {} +

Where mvjpg.sh is:
Code:
#!/bin/sh

for f; do
    mv "$f" "${f%.JPG}.jpg"
done


Obviously, you'll need to adjust the path to the shell script in the -exec primary to match its actual location on your system, if it's not on your $PATH.

Regards,
Alister

Last edited by alister; 04-25-2010 at 04:08 PM..
# 5  
Old 04-25-2010
Dear alister:

This works perfect for me !!!!

Thank you very much !!! Thank you.

Best Regards
JIA
# 6  
Old 04-25-2010
Some shell parameter substitution might help.

Code:
 blar=foo.JPG
 echo ${blar/JPG/jpg}

will output:
Code:
foo.jpg

So that means you can do:

Code:
for JPG in `find /path -type f -name \*.JPG` ; do mv $JPG ${JPG/JPG/jpg} ; done

No need for a separate script.
# 7  
Old 04-26-2010
you can even use a simple rename command as
Code:
find -name '*.JPG' -exec rename .JPG .jpg {} \;


Previous Thread | Next Thread
Test Your Knowledge in Computers #673
Difficulty: Medium
Norman Abramson, a professor at the University of Hawaii, developed the first wireless computer communication network, ALOHAnet.
True or False?

9 More Discussions You Might Find Interesting

1. AIX

Apache 2.4 directory cannot display "Last modified" "Size" "Description"

Hi 2 all, i have had AIX 7.2 :/# /usr/IBMAHS/bin/apachectl -v Server version: Apache/2.4.12 (Unix) Server built: May 25 2015 04:58:27 :/#:/# /usr/IBMAHS/bin/apachectl -M Loaded Modules: core_module (static) so_module (static) http_module (static) mpm_worker_module (static) ... (3 Replies)
Discussion started by: penchev
3 Replies

2. Shell Programming and Scripting

Bash script - Print an ascii file using specific font "Latin Modern Mono 12" "regular" "9"

Hello. System : opensuse leap 42.3 I have a bash script that build a text file. I would like the last command doing : print_cmd -o page-left=43 -o page-right=22 -o page-top=28 -o page-bottom=43 -o font=LatinModernMono12:regular:9 some_file.txt where : print_cmd ::= some printing... (1 Reply)
Discussion started by: jcdole
1 Replies

3. Shell Programming and Scripting

Delete all log files older than 10 day and whose first string of the first line is "MSH" or "<?xml"

Dear Ladies & Gents, I have a requirement to delete all the log files in /var/log/test directory that are older than 10 days and their first line begin with "MSH" or "<?xml" or "FHS". I've put together the following BASH script, but it's erroring out: for filename in $(find /var/log/test... (2 Replies)
Discussion started by: Hiroshi
2 Replies

4. UNIX for Dummies Questions & Answers

Using "mailx" command to read "to" and "cc" email addreses from input file

How to use "mailx" command to do e-mail reading the input file containing email address, where column 1 has name and column 2 containing “To” e-mail address and column 3 contains “cc” e-mail address to include with same email. Sample input file, email.txt Below is an sample code where... (2 Replies)
Discussion started by: asjaiswal
2 Replies

5. Solaris

The slices "usr", "opt", "tmp" disappeared!!! Help please.

The system don't boot. on the screen appears following: press enter to maintenance (or type CTRL-D to continue)...I checked with format command. ... the slices "0-root","1-swap","2-backup" exist. ...the slises "3-var","6-usr" -unassigned. :( (16 Replies)
Discussion started by: wolfgang
16 Replies

6. Shell Programming and Scripting

awk command to replace ";" with "|" and ""|" at diferent places in line of file

Hi, I have line in input file as below: 3G_CENTRAL;INDONESIA_(M)_TELKOMSEL;SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL My expected output for line in the file must be : "1-Radon1-cMOC_deg"|"LDIndex"|"3G_CENTRAL|INDONESIA_(M)_TELKOMSEL"|LAST|"SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL" Can someone... (7 Replies)
Discussion started by: shis100
7 Replies

7. Shell Programming and Scripting

"Join" or "Merge" more than 2 files into single output based on common key (column)

Hi All, I have working (Perl) code to combine 2 input files into a single output file using the join function that works to a point, but has the following limitations: 1. I am restrained to 2 input files only. 2. Only the "matched" fields are written out to the "matched" output file and... (1 Reply)
Discussion started by: Katabatic
1 Replies

8. Shell Programming and Scripting

cat $como_file | awk /^~/'{print $1","$2","$3","$4}' | sed -e 's/~//g'

hi All, cat file_name | awk /^~/'{print $1","$2","$3","$4}' | sed -e 's/~//g' Can this be done by using sed or awk alone (4 Replies)
Discussion started by: harshakusam
4 Replies

9. UNIX for Dummies Questions & Answers

Explain the line "mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'`"

Hi Friends, Can any of you explain me about the below line of code? mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'` Im not able to understand, what exactly it is doing :confused: Any help would be useful for me. Lokesha (4 Replies)
Discussion started by: Lokesha
4 Replies

Featured Tech Videos