как имя файла заменить на его md5-сумму

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Ychenik
Интересующийся
Сообщения: 4
Зарегистрирован: 14 окт 2014, 10:43
Контактная информация:

как имя файла заменить на его md5-сумму

Непрочитанное сообщение Ychenik » 14 окт 2014, 11:13

mkdir tmp // Создал директорию tmp
cd tmp //зашел в эту директорию
touch kart.jpg kar.txt //создал два файла
md5sum *.* //вывел md5-сумму обеих файлов
ls –al> ls.txt // записал все файлы каталога в файл ls.txt
md5sum *>md.txt // в файле md.txt записана md5-сумма и названия файлов с расширением

как заменить имена файлов на их md5-сумму, расширение при этом остается?

Ychenik
Интересующийся
Сообщения: 4
Зарегистрирован: 14 окт 2014, 10:43
Контактная информация:

Re: как имя файла заменить на его md5-сумму

Непрочитанное сообщение Ychenik » 16 окт 2014, 11:27

echo -n "Vvedite put:" ; read path
cd $path
for i in *;
do s=$(md5sum $i);
mv $i ${s:0:32}.${i:(-3)};
done

Получилось так беру первые 32 сивола(md5 sum) и последние 3 символа получаю нужный файл, но это подходит только если расширение 3 символа. Если будет 4 символа то не получится, как подправить код?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: как имя файла заменить на его md5-сумму

Непрочитанное сообщение Olej » 16 окт 2014, 11:47

Ychenik писал(а):echo -n "Vvedite put:" ; read path
cd $path
for i in *;
do s=$(md5sum $i);
mv $i ${s:0:32}.${i:(-3)};
done

Получилось так беру первые 32 сивола(md5 sum) и последние 3 символа получаю нужный файл, но это подходит только если расширение 3 символа. Если будет 4 символа то не получится, как подправить код?
1. В таких задачах вам нужно пользоваться регулярными выражениями, а не численными длинами полей:

Код: Выделить всё

[Olej@modules md5sum]$ md5sum 1111.lst 
969ba0b950defb71704178a0765e62b5  1111.lst
Вам нужно объединить (конкатенировать) 1-е поле, разделяемое пробелом + '.' + поле, следуещее (поиском) за символом '.'.
Для этого вывод md5sum нужно пропустить через фильтр регулярного ввыражения, который может делаться программами awk, sed, grep ... или средствами самого bash.
Вот как, например awk выделяет поле по разделителю:

Код: Выделить всё

[Olej@modules md5sum]$ md5sum 1111.lst | awk '{ print $2 }'
1111.lst
P.S. у меня, к сожалению, просто нет сейчас свободного времени сесть и составить вам запись регулярного выражения.

2. Обратите внимание не некоторую некорректность самой постановки вашей задачи:
- в UNIX/Linux нет такого особенно выраженного понятия как расширение имени файла (это вам не Windows ;-) )
- и у файла может быть много компонент в имени, разделённых '.'
- например 1111.lst.txt.16-10-2014.cc
- какое "расширение" вы в этом случае хотели бы сохранить за переименованным файлом .cc или .lst.txt.16-10-2014.cc ? ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: как имя файла заменить на его md5-сумму

Непрочитанное сообщение Olej » 04 июн 2016, 08:34

Olej писал(а): Для этого вывод md5sum нужно пропустить через фильтр регулярного ввыражения, который может делаться программами awk, sed, grep ... или средствами самого bash.
Посмотрите сюда: Искусство программирования на языке сценариев командной оболочки
Часть 4. Материал повышенной сложности
18. Регулярные выражения


Тема поднималась пользователем Olej 04 июн 2016, 08:34.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя