Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > *NIX системы: Общие вопросы > Проверка файла на уникальность


Автор: powerfox 23.10.2009, 03:17
Нужно проверить, является ли данный файл уникальным для определённого дерева каталогов. Вторая задача: сравнить деревья и найти уникальные файлы в каждом из них. Есть что-нибудь стандартное или нужны свои скрипты (в общем-то скрипты довольно простые)?

Автор: Imple 23.10.2009, 21:45
В каком плане уникальным? По содержимому, имени, или еще чему? Уточни плиз ;-)

Автор: powerfox 23.10.2009, 22:36
Цитата(Imple @  23.10.2009,  22:45 Найти цитируемый пост)
В каком плане уникальным? По содержимому, имени, или еще чему? Уточни плиз ;-) 

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

Скрипт делает следующее: ищет внутри дерева (папка, откуда выполнен скрипт) все файлы с именем, как и у $1, а потом использует cmp для каждого из найденых. В принципе, довольно просто (и несложно сделать сравнее деревьев, правда, простая версия без оптимизации будет долго работать).

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


Автор: Imple 23.10.2009, 22:47
Ммм... почти на 100% уверен что решения из коробки не существует. Прелагаю посмотреть в сторону алгоритмов хеширования и привязать их ПО для постоянного мониторинга изменения файлов (тем же inotify) и ведения базы актуальных хешей, в помощью которой можно в миг выдать любые уникальные файлы. Хотя, лучше воспользоваться SHA512, погрешность меньше smile

Автор: powerfox 24.10.2009, 00:07
Цитата(Imple @  23.10.2009,  23:47 Найти цитируемый пост)
Прелагаю посмотреть в сторону алгоритмов хеширования и привязать их ПО для постоянного мониторинга изменения файлов (тем же inotify) и ведения базы актуальных хешей, в помощью которой можно в миг выдать любые уникальные файлы.

Да мне, в принципе, на 1 раз нужно. Это архив фоток. Я иногда скидывал на машину А, а иногда Б. Соответственно есть бекапы (просто наболванил…) с обеих машин, а оригиналы могут быть обновлены. В итоге, получилось, что есть несколько дисков с одними и теми же фотографиями, но предположительно на каждом есть что-то уникальное. Ещё недавно в основном хранилище помереименовывал папки, что усложняет ручную сортировку.

Хэши, наверное, упростят процесс (удобнее сравнить списки хэшей по папкам и отметить уникальные, чем рыскать бэшем).

Автор: Фантом 24.10.2009, 00:15
Цитата(powerfox @  24.10.2009,  00:07 Найти цитируемый пост)

Хэши, наверное, упростят процесс (удобнее сравнить списки хэшей по папкам и отметить уникальные, чем рыскать бэшем).


Можно соорудить такой простенький скрипт (например для каталога /home/user). Сначала 
Код

find /home/user/manydupfiles -type f | while read name; do echo "$name" >> /tmp/dupsearch_`md5sum "$name" | sed 's/[ ].*//g'`; done


Это мы получили список md5 сумм (в виде файлов /tmp/dupsearch_сумма) и соответствующих им файлов (внутри).
Далее удаляем суммы, которым соответствует только один файл:
Код

ls /tmp | grep ^dupsearch_ | while read name; do [ `cat "/tmp/$name" | wc -l` -lt 2 ] && rm "/tmp/$name"; done


В итоге получается какое-то количество списков дубликатов, с которыми можно что-то делать дальше.

Автор: powerfox 24.10.2009, 01:13
Фантом, консольная магия во всей красе!
Пока не проверял, но главное — идея. Спасибо за красивое решение проблемы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)