Я бы запустил поиск дубликатов файлов (их много, выбери свой любимый) в двух папках, чтобы свести их к одному набору уникального контента. Затем насыпной переименовать *
в folder1_*
в первой папке, аналогично во втором, чтобы обеспечить уникальные имена. Затем объедините их с помощью обычного перемещения файла.
Объедините две директории в Linux, чтобы получить все уникальные файлы
У меня есть каталоги, давайте их называть folder1
и folder2
. В каждом из этих папок образа с именем 1.jpg
, 2.jpg
и так далее.
К сожалению, файл 1.jpg
в folder1
может быть другой картинкой, чем 1.jpg
в folder2
. Кроме того, возможно, что файл 1.jpg
в folder1
является той же картинкой, что и 42.jpg
в folder2
. Поэтому я не могу использовать имя файла, чтобы различать эти картинки.
Идея теперь состоит в том, чтобы использовать хеш вместо имени файла.
Цель состоит в том, чтобы объединить обе папки в одну, чтобы в целевой папке были все уникальные изображения обеих папок.
Есть ли простое решение этой проблемы?
3 ответа на вопрос
Если вам не нужны имена, в каждой папке переместите файлы в целевую папку, переименовав их после их хеша 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
(одна строчка сверху отсюда )
Это должно сделать это, чтобы немного адаптироваться в соответствии с вашими соглашениями об именах, и вы теряете оригинальные имена (в противном случае вам нужно выяснить, что делать, если у вас дважды одинаковое имя с разным контентом).
(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/
и т. Д. Многие вещи можно исправить в зависимости от ваших конкретных требований, но вышеприведенное является рабочей основой.
Похожие вопросы
-
9
В чем разница между командами "su -s" и "sudo -s"?
-
4
Требуется хороший бесплатный образ Ubuntu Server VMWare
-
4
Каковы различия между основными дистрибутивами Linux? Я замечу?
-
-
2
Ограничить использование процессора для Flash в Firefox?
-
2
Как мне заставить мой микрофон работать под Debian GNOME?
-
2
Конки установки - образцы / идеи?
-
3
Каковы различия между оконными менеджерами Linux?
-
2
ThunderBird / Синхронизация освещения с SE k770i
-
4
Файловая система Linux
-
6
Полноэкранная медленная вспышка в KDE 4