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.
Asked
Active
Viewed 3.6k times
5 Answers
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,329
- 2
- 24
- 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
- 26,337
- 7
- 59
- 90
6
All great answers, thanks. This is what worked in my case:
rename 's/^.......//g' *

wlk
- 1,713
- 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
- 115,471
- 20
- 215
- 297
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
-
most elegant answer. – Sandwich Apr 09 '20 at 14:06