10

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.

11

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.

| improve this answer | |
9

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.

| improve this answer | |
5

You can use sed to do this

for file in * ; do mv $file  $(echo $file |sed 's/^.\{5\}//g'); done
| improve this answer | |
5

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

rename 's/^.......//g' *
| improve this answer | |
1

My two cents':

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

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

| improve this answer | |
  • most elegant answer. – Sandwich Apr 9 at 14:06

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.