Rename files to md5 sum + extension (BASH)
10,931
Solution 1
This might work for you:
# mkdir temp && cd temp && touch file.{a..e}
# ls
file.a file.b file.c file.d file.e
# md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/' | sh
`file.a' -> `d41d8cd98f00b204e9800998ecf8427e.a'
`file.b' -> `d41d8cd98f00b204e9800998ecf8427e.b'
`file.c' -> `d41d8cd98f00b204e9800998ecf8427e.c'
`file.d' -> `d41d8cd98f00b204e9800998ecf8427e.d'
`file.e' -> `d41d8cd98f00b204e9800998ecf8427e.e'
Or GNU sed can do it even shorter:
# md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/e'
Solution 2
I would go this route:
for F in $DIR/*.*; do
mv "$F" "$(md5sum "$F" | cut -d' ' -f1).${F##*.}";
done
Use ${F#*.}
to get everything after the first period, e.g. tar.gz
instead of gz
(depends on your requirements)
Author by
Admin
Updated on June 19, 2022Comments
-
Admin almost 2 years
I need some help with a bash script. Script needs to rename all files in a directory to its md5 sum + extension.
I have found the bash script below, but it needs to be changed so that it will add the extension.
md5sum * | sed 's/^\(\w*\)\s*\(.*\)/\2 \1/' | while read LINE; do mv $LINE; done
-
fnl almost 8 yearsThe Apple/OSX version is:
md5 * | sed -e 's/MD5 (\([^.]*\)\(.[^)]*\)) = \(.*\)$/mv -v "\1\2" \3\2/' | sh
-
Giacomo Pigani over 6 yearsOSX:
for F in $DIR/*.*; do mv "$F" "$(md5 "$F" | cut -d' ' -f4).${F##*.}"; done
-
ggranum over 5 yearsIf you have a large number of files on OSX:
ls -1 | while read file; do md5 "$file" | sed -e 's/MD5 (\(.*\)\(\.[^\d]*\)) = \(.*\)$/mv -v "\1\2" "\3\2"/' | sh ; done
( This extends from @fnl's version to handle a case where I had a timestamp with a decimal in some file names ) -
Takase almost 4 yearsThis solution may not be able to handle filenames with spaces, beware. I have a few files that doesn't work with this and they all have spaces