11

I have to rename multiple files in directory by removing first 5 characters for each filename.
How can I do this i bash/shell? I'm using Ubuntu 11.10. Thanks.

wlk
  • 1,643
  • 3
  • 14
  • 19

5 Answers5

13

A simple for loop with a bit of sed will do the trick:

% touch xxxxx{foo,bar,baz}
% ls -l xxxxx{foo,bar,baz}
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbaz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxfoo  
% for file in xxxxx*; do mv $file $(echo $file | sed -e 's/^.....//'); done
% ls -l foo bar baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 bar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 foo

The substitute regex in sed says to match any five characters (. means any character) at the start of the string (^) and remove it.

James O'Gorman
  • 5,249
  • 2
  • 23
  • 28
10

Bash has some amazing scripting possibilities. Here's one way:

for file in ??????*; do mv $file `echo $file | cut -c6-`; done

A handy way to test what it would do is to add an echo in front of the command:

for file in ??????*; do echo mv $file `echo $file | cut -c6-`; done

The six question marks ensure that you only attempt to do this to filenames longer than 5 characters.

Ladadadada
  • 25,847
  • 7
  • 57
  • 90
6

All great answers, thanks. This is what worked in my case:

rename 's/^.......//g' *
wlk
  • 1,643
  • 3
  • 14
  • 19
5

You can use sed to do this

for file in * ; do mv $file  $(echo $file |sed 's/^.\{5\}//g'); done
user9517
  • 114,104
  • 20
  • 206
  • 289
1

My two cents':

for file in *; do mv $file ${file:5}; done

${file:n} removes the first n characters in the string file.

dkcm
  • 11
  • 1