Rename files with MD5 hash


This post goes over how to rename file(s) with MD5 hash.

Rename single file

To generate an MD5 hash based on the file content:

md5 -q file.txt

Output:

d41d8cd98f00b204e9800998ecf8427e

Then to rename the file with its hash:

mv file.txt "file.$(md5 -q file.txt).txt"
ls
file.d41d8cd98f00b204e9800998ecf8427e.txt

Rename multiple files

To rename each file with its MD5 hash:

find . -type f -exec bash -c 'mv "${1%.*}.$(md5 -q $1).${1##*.}"' bash {} \;

Let’s break down what’s happening.

1. We’re using find to list all the files in directory . (current):

find . -type f
./file1.txt
./file2.txt

2. For each argument (referenced by $1), you can execute a bash command with -exec bash -c:

find . -type f -exec bash -c 'echo $1' bash {} \;

3. Get the file basename with ${1%.*}:

find . -type f -exec bash -c 'echo ${1%.*}' bash {} \;

4. Get the file extension with ${1##*.}:

find . -type f -exec bash -c 'echo ${1##*.}' bash {} \;

5. Generate the MD5 hash with $(md5 -q $1):

find . -type f -exec bash -c 'echo $(md5 -q $1)' bash {} \;

6. Finally, concatenate the string with . and rename each file with mv:

find . -type f -exec bash -c 'mv $1 "${1%.*}.$(md5 -q $1).${1##*.}"' bash {} \;

To rename files with spaces, wrap $1 in double quotes (credit goes to Andreas Sahlbach):

find . -type f -exec bash -c 'mv "$1" "${1%.*}.$(md5 -q "$1").${1##*.}"' bash {} \;


Please support this site and join our Discord!