I would like to rename cca 1000 files that are named like: 66-123123.jpg -> abc-123123-66.jpg. So in general file format is: xx-yyyyyy.jpg -> abc-yyyyyy-xx.jpg, where xx and yyyyyy are numbers, abc is string. Can someone help me with bash or py script?
-
1Is every prefix going to be the same (i.e. will the prefix always be 'abc')? – ubomb Nov 22 '13 at 21:10
-
1Also, you should really show what you've tried first per [StackOverflow's guidelines](http://stackoverflow.com/about). – ubomb Nov 22 '13 at 21:14
-
Every prefix is abc. "abc" is constant. – user2123280 Nov 22 '13 at 21:21
4 Answers
for file in ??-??????.jpg ; do
[[ $file =~ (..)-(......)\.jpg ]]
mv "$file" "abc-${BASH_REMATCH[2]}-${BASH_REMATCH[1]}.jpg" ;
done
This requires bash 4 for the regex support. For POSIXy shells, this will do
for f in ??-??????.jpg ; do
g=${f%.jpg} # remove the extension
a=${g%-*} # remove the trailing "-yyyyyy"
b=${g#*-} # remove the leading "xx-"
mv "$f" "abc-$b-$a.jpg" ;
done

- 238,783
- 38
- 220
- 352
Try doing this :
rename 's/(\d{2})-(\d{6})\.jpg/abc-$2-$1.jpg/' *.jpg
There are other tools with the same name which may or may not be able to do this, so be careful.
If you run the following command (linux
)
$ file $(readlink -f $(type -p rename))
and you have a result like
.../rename: Perl script, ASCII text executable
then this seems to be the right tool =)
If not, to make it the default (usually already the case) on Debian
and derivative like Ubuntu
:
$ sudo update-alternatives --set rename /path/to/rename
(replace /path/to/rename
to the path of your perl's rename
command.
If you don't have this command, search your package manager to install it or do it manually.
Last but not least, this tool was originally written by Larry Wall, the Perl's dad.

- 21,988
- 13
- 81
- 109

- 173,512
- 41
- 224
- 223
You could use the rename
command, which renames multiple files using regular expressions. In this case you would like to write
rename 's/(\d\d)-(\d\d\d\d\d\d)/abc-$2-$1/' *
where \d
means a digit, and $1
and $2
refer to the values matched by the first and second parenthesis.

- 3,869
- 2
- 22
- 22
Being able to do things like this easily, is why I name my files the way I do. Using a + sign lets me cut them all up into variables, and then I can just re-arrange them with echo.
#!/usr/bin/env bash
set -x
find *.jpg -type f | while read files
do
newname=$(echo "${files}" | sed s'@-@+@'g | sed s'@\.jpg@+.jpg@'g)
field1=$(echo "${newname}" | cut -d'+' -f1)
field2=$(echo "${newname}" | cut -d'+' -f2)
field3=$(echo "${newname}" | cut -d'+' -f3)
finalname=$(echo "abc-${field2}-${field1}.${field3}")
mv "${files}" "${finalname}"
done

- 616
- 4
- 7