Как переименовать несколько файлов в их содержание «сумма MD5?

Я хотел бы переименовать некоторые файлы в их содержимое «MD5 sum; например, если файл foo пуст, его следует переименовать в d41d8cd98f00b204e9800998ecf8427e .

Должен ли он быть сценарием или я могу использовать что-то вроде инструмента rename ?

Ответ Гленна хорош; вот уточнение для нескольких файлов:

 md5sum file1 file2 file3 | # or *.txt, or whatever while read -r sum filename; do mv -v "$filename" "$sum" done 

Если вы создаете файлы с find или похожими, вы можете заменить вызов md5sum чем-то вроде find . <options> -print0 | xargs -0 md5sum find . <options> -print0 | xargs -0 md5sum find . <options> -print0 | xargs -0 md5sum (с выходом также передается в контур оболочки).

Это выводит вывод md5sum , который состоит из нескольких строк с суммой, а затем с файлом, который ему соответствует, и передает его в цикл оболочки, который читает каждую строку и выдает команду mv которая переименовывает файл из исходного имени в сумма. Любые файлы с одинаковыми суммами будут перезаписаны; (например, если вы играете с хеш-колламированием md5), это будет означать, что они имеют одинаковое содержимое, поэтому вы все равно не теряете никаких данных. Если вам нужно ввести другие операции над каждым файлом, вы можете поместить их в цикл, ссылаясь на переменные $filename и $sum , которые содержат исходное имя файла и сумму MD5 соответственно.

С zsh :

 autoload zmv # best in ~/.zshrc zmv '**/*(#qD.)' '$(md5sum<$f)' 

Переименуйте все обычные файлы, рекурсивно.

(обратите внимание, что он откажется переименовать любой файл, если два файла в одном каталоге имеют одну и ту же контрольную сумму, добавьте -f чтобы переопределить это).

**/*(#qD.) – это рекурсивный глобус zsh с квалификаторами glob (в их явном виде как (#q<qualifiers>) , D для включения скрытых файлов, только для выбора обычных файлов.

Баш:

 md5sum my.file.here | { read sum filename; mv $filename $sum; }