Переименование файлов на основе контрольной суммы

У меня есть список md5sum и много файлов, которые я хотел бы проверить, а затем переименовать их в соответствии с списком md5sum.

Пример списка:

d4cd401ade018617629b39efed7b7be4 foo.bar 8fdb07ca55c164e0d5a69eff49fe800e bar.foo 8b167d01009f066aaf2d6c1ba336d842 foobar 

Теперь я хотел бы проверять все файлы в текущем каталоге, если контрольная сумма сопоставляется с приведенным выше списком, тогда переименуйте ее как правую.

Как я могу это сделать?

4 Solutions collect form web for “Переименование файлов на основе контрольной суммы”

Может быть, это может помочь. Я не полностью тестировал, это просто теоретически работает. Заменить в случае необходимости:

 #! /bin/bash for II in * do if [ -f "$II" ]; then TMPV=$(md5sum "$II") MD="${TMPV%\ \ *}" TMPV=$(grep "$MD" hashes.txt) if [ ! -z "$TMPV" ]; then FN="${TMPV#*\ \ }" echo "Found: $II" echo "MD5 is: $MD" echo "Which matches $FN in hashes database" echo "Will Rename $II TO $FN" echo "" # CAREFUL, RENAME CMD: mv "$II" "$FN" fi; fi; done; 

Как я уже сказал, не проверял, но, похоже, работал на моей коробке. Надеюсь, поможет.

Прежде всего, я не буду утверждать, что это самое глубокое решение, но вот один из способов сделать это.

Предположим, у вас есть файл с контрольной суммой и именами filelist.txt именем filelist.txt тогда вы можете использовать что-то вроде:

 while read -r checksum fname; do for f in file*; do if [[ $checksum == $(md5sum "$f" | cut -d' ' -f1) ]]; then mv "$f" "$fname"; fi ; done ; done < filelist.txt 

Моя идея:

  1. Сначала вам нужно отсортировать свои контрольные суммы: sort checksums.txt > sorted_checksums.txt
  2. Сгенерировать файл для всех существующих файлов, а также отсортировать их: md5sum * | sort > real_checksums.txt md5sum * | sort > real_checksums.txt
  3. Присоединяйтесь к этим двум файлам и исключите записи с join -o "2.2 1.2" sorted_checksums.txt real_checksums.txt | awk '$1 != $2' > rename_pairs.txt же новыми и старыми именами: join -o "2.2 1.2" sorted_checksums.txt real_checksums.txt | awk '$1 != $2' > rename_pairs.txt join -o "2.2 1.2" sorted_checksums.txt real_checksums.txt | awk '$1 != $2' > rename_pairs.txt
  4. Переименуйте все файлы: cat rename_pairs.txt | xargs -L 1 echo mv cat rename_pairs.txt | xargs -L 1 echo mv (Удалить echo от xargs для фактического переименования файлов)

ПРЕДУПРЕЖДЕНИЕ: это будет работать только в том случае, если в именах файлов нет пробелов. Вы можете использовать awk 'NF != 2' sorted_checksums.txt real_checksums.txt чтобы проверить это, и если будет напечатана какая-либо строка, вам нужно использовать что-то еще (может быть, просто perl или python program) для шагов 3 и 4.

Прочитайте контрольные суммы в ассоциативном массиве, затем просмотрите файлы и переименуйте их по мере необходимости. Поместите переименованные файлы в отдельное дерево каталогов, если есть совпадение между новыми именами и старыми именами.

 #!/bin/bash mkdir renamed typeset -A names while read -r sum name; do names[$sum]=$name done <list.md5sum for file in *; do if [[ -f $file ]]; then sum=$(md5sum <"$file"); sum=${sum%% *} if [[ -n ${names[$sum]} ]]; then mv -- "$file" "renamed/${names[$sum]}" fi fi done 
  • Как администратор системы может заблокировать доступ к файлу в течение 24 часов?
  • Ли `du` перечисляет каждый отдельный файл в системе?
  • Удалить последний измененный файл
  • Какие символы действительны для использования в именах файлов?
  • Неизменяемый бит в AIX?
  • Машина сохраняет резервные копии файлов, которые я уже удалил
  • Лучший способ только перечислить файлы, которыми я владею
  • Найти файлы, содержащие ключевое слово, и показать только путь к файлу и номер строки
  • Автоматическое перемещение файлов в каталог один за другим и только тогда, когда целевая папка пуста
  • Идентифицировать файлы / процессы, которые предотвращают повторное подключение только для чтения
  • Бинарный файл Hexdump при выполнении разделителей
  • Interesting Posts

    Почему Bash не удалось найти команду, даже если $ PATH указан правильно?

    Запуск / выключение сервера Minecraft с помощью systemd

    socat E SSL_CTX_load_verify_locations ():

    для цикла, чтобы получить более одного аргумента

    Почему Ubuntu использует Debian «нестабильно»? Как же тогда удается быть стабильным?

    Как исправить эти нарушенные зависимости?

    Является ли сценарий запущенным внутри подстановки команд?

    Установка переключаемых графических драйверов на Linux Mint

    Выведите что-нибудь (в цикле) до нажатия клавиши

    Можно ли дублировать дескриптор входного файла и использовать его для записи данных?

    Синхронизация пакетов / конфигов / установка между компьютерами

    Давайте зашифруем ошибку обновления

    Есть ли более современная или более популярная версия evms2?

    Игрок или плагин, который может транслировать аудио в субтитры в реальном времени

    Не удалось установить CentOS в VirtualBox

    Linux и Unix - лучшая ОС в мире.