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

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

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

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

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

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

  • Могу ли я заставить `cut` изменять файл на месте?
  • Что делают файлы dead.letter
  • Я хочу перечислить все файлы на моем Linux-сервере, которые старше 31 декабря 2014 года.
  • Undeleteable 33GiB файл на USB-Stick 4GiB. fsck говорит «clean», Ошибка: «Операция не разрешена»
  • Не удается войти в систему, казалось бы, заблокирована из домашнего каталога
  • как переместить много подпапок в родительский каталог?
  • Создание длинного звукового файла с SOX без фактического воспроизведения тона
  • Поиск файлов внутри нескольких подкаталогов и zip-каталогов
  • 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
    Linux и Unix - лучшая ОС в мире.