Batch Renaming multiple files with different extensions Linux Script?

George Hadley picture George Hadley · Mar 23, 2013 · Viewed 7.3k times · Source

I would like to write a linux script that will move or copy all files with the same filename (but different extensions) to a new filename for all those files, while maintaining their different extensions. In other words:

if I start with a directory listing:

file1.txt, file1.jpg, file1.doc, file12.txt, file12.jpg, file12.doc

I would like to write a script to change all the filenames without changing the extensions. For the same example, choosing file2 as the new filename the result would be:

file2.txt, file2.jpg and file2.doc, file12.txt, file12.jpg, file12.doc

So the files whose filename do not match the current criteria will not be changed.

Best wishes,

George

Answer

plesiv picture plesiv · Mar 23, 2013

Note: If there's file1.doc in variable i, expression ${i##*.} extracts extension i.e. doc in this case.


One line solution:

for i in file1.*; do mv "$i" "file2.${i##*.}"; done

Script:

#!/bin/sh
# first argument    - basename of files to be moved
# second arguments  - basename of destination files
if [ $# -ne 2 ]; then
    echo "Two arguments required."
    exit;
fi

for i in $1.*; do
    if [ -e "$i" ]; then
        mv "$i" "$2.${i##*.}"
        echo "$i to $2.${i##*.}";
    fi
done