How to rename multiple files at once in Linux
This post shows how to rename multiple files in Linux at once, include rename files using pattern and using command find to rename multiple files recursively, of course also include how to rename the extension of multiple files.
Method1 : Rename multiple files using command mv
we can mv command to rename file , normally one file once. But we can use for loop or find command together to rename multiple files at once.
For loop
Below example rename files with extension htm to html
j@ubuntu2004:~/tmp/1010$ ls
1.htm 2.htm 3.htm
j@ubuntu2004:~/tmp/1010$ for f in *.htm ; do mv $f ${f/.htm/.html} ; done
j@ubuntu2004:~/tmp/1010$ ls
1.html 2.html 3.html
Here ${f/.htm/.html} is shell parameter expansion
Alternatively you can try sed version
j@ubuntu2004:~/tmp/1010$ ls
1.html 2.html 3.html
j@ubuntu2004:~/tmp/1010$ for f in *.html; do mv "$f" "$(echo "$f" | sed s/html$/htm/)"; done
j@ubuntu2004:~/tmp/1010$ ls
1.htm 2.htm 3.htm
The benefit is you can use regular expression
Find command
j@ubuntu2004:~/tmp/1010$ ls
1.htm 2.htm 3.htm
j@ubuntu2004:~/tmp/1010$ find . -name '*.htm' -exec bash -c 'mv $0 ${0/.htm/.html}' {} \;
j@ubuntu2004:~/tmp/1010$ ls
1.html 2.html 3.html
Above command used find and shell parameter expansion to rename multiple files.
Using find and sed
j@ubuntu2004:~/tmp/1010$ ls
1.html 2.html 3.html
j@ubuntu2004:~/tmp/1010$ for f in *.html;do mv $f $(echo $f |sed s/.html/.htm/);done
j@ubuntu2004:~/tmp/1010$ ls
1.htm 2.htm 3.htm
The benefit of using find is you can rename multiple files recursively or traversing directories.
One more example:
j@ubuntu2004:~/tmp/1010$ ls
prefix01.htm prefix02.htm prefix03.htm
j@ubuntu2004:~/tmp/1010$ for f in *.htm;do mv $f $(echo $f |sed s/^prefix/pre/);done
j@ubuntu2004:~/tmp/1010$ ls
pre01.htm pre02.htm pre03.htm
Method 2 : Rename multiple files using rename
Please be noted for rename command it’s different between Debian/Ubuntu and other version of linux like centos/rhel.
In Debian/Ubuntu
To install rename
sudo apt install rename
Below example renames files with extension .htm to .html
j@ubuntu2004:~/tmp/1010$ ls
1.htm 2.htm 3.htm
j@ubuntu2004:~/tmp/1010$ rename 's/.htm/.html/' *.htm
j@ubuntu2004:~/tmp/1010$ ls
1.html 2.html 3.html
One more example:
j@ubuntu2004:~/tmp/1010$ ls
pre01.htm pre02.htm pre03.htm
j@ubuntu2004:~/tmp/1010$ rename 's/^pre/PRE/' *.htm
j@ubuntu2004:~/tmp/1010$ ls
PRE01.htm PRE02.htm PRE03.htm
Please man rename for more usages
In RHEL/CentOS
[j@centos 1010]$ ls
1.htm 2.htm 3.htm
[j@centos 1010]$ rename .htm .html *.htm
[j@centos 1010]$ ls
1.html 2.html 3.html
One more example:
[j@centos 1010]$ ls
pre01.htm pre02.htm pre03.htm
[j@centos 1010]$ rename pre PRE *.htm
[j@centos 1010]$ ls
PRE01.htm PRE02.htm PRE03.htm
Here you can see the usage of rename in Centos is totally different with the one in Debian/Ubuntu.
Also please man rename for details