1

У меня есть каталоги, давайте назовем их folder1 и folder2 . В каждой из этих папок находятся изображения с именами 1.jpg , 2.jpg и так далее.

К сожалению, файл 1.jpg в folder1 может быть другой картинкой, чем 1.jpg в folder2 . Кроме того, возможно, что файл 1.jpg в folder1 1 совпадает с изображением 42.jpg в folder2 . Поэтому я не могу использовать имя файла, чтобы различать эти картинки.

Идея теперь состоит в том, чтобы использовать хеш вместо имени файла.

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

Есть ли простое решение этой проблемы?

3 ответа3

0

Я бы запустил поиск дубликатов файлов (их много, выбери свой любимый) в двух папках, чтобы свести их к одному набору уникального контента. Затем массовое переименование из * в folder1_* в первой папке, аналогично второй, чтобы обеспечить уникальные имена. Затем объедините их с помощью обычного перемещения файла.

0

Если вам не нужны имена, в каждой папке переместите файлы в целевую папку, переименовав их после их хеша MD5:

for f in folder1/* folder2/*;do mv -nv "$f" target/$(md5sum -b "$f" | cut -d ' ' -f 1); done

-n не является строго обязательным, это предотвращает засорение первого перемещенного файла вторым идентичным файлом. В итоге получается, что с ним дубликаты остаются в их исходных каталогах, и у вас есть представление о том, сколько у вас было дупликов).

Затем, если необходимо, дайте им другой набор произвольных имен (выполните в target):

ls | cat -n | while read n f; do mv "$f" "$n.extension"; done

(одна строчка сверху отсюда)

-1

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

(for file in folder1/* folder2/* ; do md5sum $file ; done) | sort | awk '{print $2 " " $1}' | uniq -f 1 -c | while read count name hash ; do cp $name dest/$hash ; done

Или, если вы не хотите потерять оригинальное имя файла, просто измените его:

(for file in folder1/* folder2/* ; do md5sum $file ; done) | sort | awk '{print $2 " " $1}' | uniq -f 1 -c | while read count name hash ; do cp $name dest/$(echo $name | sed -e 's/\//_/') ; done

Для простоты сделано много предположений: никаких путей с пробелами, выполнение действий поверх обоих каталогов, вывод в каталог dest/ и т.д. Многие вещи можно исправить в зависимости от ваших конкретных требований, но приведенное выше является рабочей основой.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .