Объедините две директории в Linux, чтобы получить все уникальные файлы

420
Dennis

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

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

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

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

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

1

3 ответа на вопрос

0
Ben Scott

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

0
xenoid

Если вам не нужны имена, в каждой папке переместите файлы в целевую папку, переименовав их после их хеша 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
Patrick Mevzek

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

(for file in folder1/* folder2/* ; do md5sum $file ; done) | sort | awk '' | 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 '' | uniq -f 1 -c | while read count name hash ; do cp $name dest/$(echo $name | sed -e 's/\//_/') ; done 

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

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