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

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

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

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

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

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

  • Установите дату создания файла в дату его изменения на OSX
  • Как выбрать имена файлов с последовательными числовыми суффиксами?
  • Поиск символических ссылок указывает на одну и ту же цель
  • Как удалить пустой каталог (файловая система btrfs)?
  • Как gcc обрабатывает разрешения файлов?
  • Как проверить, принадлежат ли две директории или файлы одной и той же файловой системе
  • rsync не сохраняет права на каталоги даже с -a
  • Что такое тип файла «необработанные данные G3, байт-padded»
  • 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 
    Interesting Posts

    Отклоните SSH-соединения от стран, не включенных в список, используя hosts.allow / hosts.deny в CentOS

    играя звук / уведомление в finch поверх ssh на моей локальной машине

    tar-каталоги, содержащие пробелы

    «Ssh -L <port>» работает только с локальной машины

    Как создать Swap из уже созданных точек монтирования

    Ограничить каталог только одним файлом?

    Исправление Linux-ядра on-line (т.е. без перезагрузки)

    У Solaris есть эквивалент /etc/ld.so.conf?

    loggedfs завершает работу с «доступом: конечная точка транспорта не подключена»

    доступ к системе / dev / xx был изменен при перезапуске systemd

    CentOS не запускается после изменения среды

    Как получить доступ к сетевому принтеру с сервера печати Windows?

    Почему скорость загрузки в Linux намного ниже, чем в других ОС?

    grep seach pattern из файла, содержащего список шаблонов, запись результата каждого шаблона в indivdual файлы

    почему значение inode изменяется при редактировании в редакторе vi?

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