Переименовать файлы в сумму md5 + расширение (BASH)

Мне нужна помощь с скриптом bash. Скрипт должен переименовать все файлы в каталоге в его сумму md5 + расширение.

Я нашел сценарий bash ниже, но его нужно изменить, чтобы добавить расширение.

md5sum * | sed 's/^\(\w*\)\s*\(.*\)/\2 \1/' | while read LINE; do mv $LINE; done

person ICTdesk.net    schedule 20.11.2011    source источник


Ответы (3)


Это может сработать для вас:

# 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'

Или GNU sed может сделать это еще короче:

# md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/e'
person potong    schedule 20.11.2011
comment
Версия Apple/OSX: md5 * | sed -e 's/MD5 (\([^.]*\)\(.[^)]*\)) = \(.*\)$/mv -v "\1\2" \3\2/' | sh - person fnl; 23.05.2016
comment
Если у вас есть большое количество файлов в OSX: ls -1 | while read file; do md5 "$file" | sed -e 's/MD5 (\(.*\)\(\.[^\d]*\)) = \(.*\)$/mv -v "\1\2" "\3\2"/' | sh ; done (это распространяется от версии @fnl для обработки случая, когда у меня была временная метка с десятичной запятой в некоторых именах файлов) - person ggranum; 20.11.2018
comment
Это решение может не обрабатывать имена файлов с пробелами, будьте осторожны. У меня есть несколько файлов, которые не работают с этим, и во всех них есть пробелы. - person Takase; 07.06.2020

Я бы пошел по этому пути:

for F in $DIR/*.*; do
  mv "$F" "$(md5sum "$F" | cut -d' ' -f1).${F##*.}";
done

Используйте ${F#*.}, чтобы получить все после первого периода, например. tar.gz вместо gz (зависит от ваших требований)

person knittl    schedule 20.11.2011
comment
ОС X: for F in $DIR/*.*; do mv "$F" "$(md5 "$F" | cut -d' ' -f4).${F##*.}"; done - person Giacomo Tecya Pigani; 23.11.2017

find . -type f -exec mv \{\} "`md5sum \{\} | sed 's/ .*//'`.`echo \{\} | awk -v FS='.' '{print $NF}'\" 

Или что-то вроде этого подойдет :-). На самом деле, я бы рекомендовал добавить фильтр к именам файлов для команды find, так как она не будет работать с файлами без . в их имени.

ХТН

person Zsolt Botykai    schedule 20.11.2011