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

Вы также можете использовать pidof. Ознакомьтесь с man pidof или info pidof . Например, запуск его в моей текущей настройке представляет следующее:

pidof chrome
3946 3202 3194 3175 3154 3137 3114 3103 3077 3024 3019 3012 3005 2998 

Как предложил @Ijaz, вы также можете получить счет:

pidof chrome | wc -l
14
6
06.12.2016, 14:56
4 ответа

Моя идея:

  1. Сначала вам нужно отсортировать известные контрольные суммы: sort checkums.txt> sorted_checksums.txt
  2. Сгенерировать файл для всех существующих файлов и также отсортируйте их: md5sum * | sort> real_checksums.txt
  3. Соедините эти два файла и исключите записи с одинаковыми новыми и старыми именами: 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 (Удалите echo из xargs , чтобы фактически переименовать файлы)

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

0
27.01.2020, 20:28

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

#!/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
0
27.01.2020, 20:28

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

Допустим, у вас есть файл с контрольной суммой и именами файлов под названием 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
4
27.01.2020, 20:28

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

#! /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;

Как я уже сказал, не тестировал, но, похоже, на моем ящике это сработало.

3
27.01.2020, 20:28

Теги

Похожие вопросы