21

I have a bunch of files as follows:

04602635_b0294.DAT20120807164534
04602637_b0297.DAT20120807164713
04602638_b0296.DAT20120807164637
04602639_b0299.DAT20120807164819
04602640_b0298.DAT20120807164748
04602641_b0300.DAT20120807164849
04602650_b0301.DAT20120807164921
04602652_b0302.DAT20120807164956

I need to rename them to exclude the prefix. It needs to look like this..

b0294.DAT20120807164534
b0297.DAT20120807164713
b0296.DAT20120807164637
b0299.DAT20120807164819
b0298.DAT20120807164748
b0300.DAT20120807164849
b0301.DAT20120807164921
b0302.DAT20120807164956

EDIT

I forgot to add that I am using Solaris.

2 Answers 2

33
for file in * ; do
    echo mv -v "$file" "${file#*_}"
done

run this to satisfy that everything is ok.
if it is, remove echo from command and it will rename files as you want.

"${file#*_}"

is a usual substitution feature in the shell. It removes all chars before the first _ symbol (including the symbol itself). For more details look here.

3
  • 1
    Could you please explain what exactly is happening in "${file#*_}"? Aug 10, 2012 at 13:23
  • I added explanation to my answer.
    – rush
    Aug 10, 2012 at 13:31
  • 1
    IMO, most all scripts should be written to echo the desired command output. But don't then remove the echo, just pipe the script output into bash.
    – Jim L.
    May 29, 2019 at 16:19
11

You can use the tool rename for this:

rename "s/.*_//" *

If you append -n it won't rename anything and just show you what would have been done without -n.

In response to rush's comment: my rename is is actually a link to prename shipped with Debian's and Ubuntu's perl package.

5
  • 5
    Note, that rename not always is the same on different systems and sometimes its syntax may differ.
    – rush
    Aug 10, 2012 at 13:34
  • 1
    The asker has now added that he's using Solaris. So this rename command (which is specific to Debian and derivatives) is not available to him. Aug 10, 2012 at 22:34
  • 1
    ...unless he manages to build it from source. May 17, 2013 at 5:47
  • @Gilles perl-rename is not at all specific to Debian. It's just not called rename but perl-rename or prename in other distributions. It should always be in the repos though and one is installed with perl as well.
    – terdon
    Apr 27, 2017 at 11:06
  • @terdon A command to rename files whose basic usage is a perl expression is not specific to Debian. Such a command, called rename and likely to be installed without explicitly requesting a package which is not called just rename, is specific to Debian. Other Linux distributions call the command prename or perl-rename to avoid confusion with the util-linux rename and don't bundle it with the perl package, and I'm not aware of any non-Linux unix that ships it under the name rename or that ships it in a default installation under any name. Apr 27, 2017 at 11:18

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.