18.01.2010 23:27
digiwhite — Сравнение двух директорий и удаление из второй файлов-дубликатов
Чего-то читая форумы, увидел, что некоторые ищут как удалить файлы-дубликаты (чаще это фотографии или музыка) из одного из двух каталогов. Поэтому, решил набросать скриптик на bash`е, который позволяет это делать.Скрипт не очень большой и достаточно простой. При желании, его можно расширить и усложнить, добавив функциональности.
Собственно далее идет код:
Суть работы скрипта достаточно проста и прозрачна.
В начале, мы проверяем количество параметров, что за параметры нам были переданы и совпало ли их количество. Далее проверяем, существуют ли указанные директории. Если директории существуют, то создаем два списка (по одному для каждой директории), содержащих пары {хеш значение файла(дайджест),имя файла}. Списки эти получаются в два этапа:
создание отсортированного списка файлов (можно и не сортировать конечно);
прохождение по списку файлов из пункт 1 и подсчет для каждого файла хеш-значения с помощью md5sum (можно так же использовать sha1sum, sha224sum, sha256sum и т.п.), и запись пары {хеш-значение, имя файла} в другой список.
Затем сравниваем оба списка поэлементно - каждый элемента списка файлов первой директории с каждым элементом списка файлов второй директории. Если элементы совпали, то из второй директории удаляем файл-дубликат. Когда сравнение списков завершается, то удаляем временные файлы, содержащие сами списки.
Как использовать:
1 |
|
Если в директории dir2 будут найдены файлы, совпадающие по содержимому с файлами в dir1, то они будут удалены из dir2.
Минусы: по идее, сначала надо проверить на дубликаты каждую директорию саму с собой (чтобы исключить наличие дублирующихся файлов в директории) и затем уже сравнивать друг с другом. Есть вероятность, что md5sum выдаст на разных файлах одинаковое хеш-значение (однако вероятность этого очень, очень мала, но для тех кто сомневается может заменить md5sum на sha384sum или sha512sum для большей уверенности).
Плюсы: все равно какие файлы сравнивать. Это не имеет значения.
oldbay 19.01.2010 01:11 #
+ 5 -
а если diff использовать ?
А чего вы? Если вывод
Но подозреваю, что diff ощутимо медленнее md5sum работает.
diff file1 file2
пустой, значит, файлы одинаковые. При этом исключены коллизии (одинаковые хэши для разных файлов), т.к. никакие хэши вообще не считаются — идёт тупое сравнение.Но подозреваю, что diff ощутимо медленнее md5sum работает.
Либо я чего-то не знаю, либо попробуйте применить diff для двоичных файлов.
Да-да. Проверил. Просто перед написанием скрипта тупанул и показалось что с бинарными файлами не работает.
Осталось сравнить скорости сравнения в том и в другом случае.
Осталось сравнить скорости сравнения в том и в другом случае.
Да это ж не упрек.
И я тож люблю консоль, но это - так - другим в качестве альтернативы..
И я тож люблю консоль, но это - так - другим в качестве альтернативы..
Там ссылка на скачивание старого кода, на гуглокоде по-свежее.
Вот пришел на работу, загрузил QNX4 и понял, что ничего из вами перечисленного там нет.
Если директории "близнецы", то вполне можно использовать для этой цели rsync.
Извините, то что я написал этот комментарий сведетельсвует что вчерашний день удался :)
> *) echo "Bad";
> exit 0
Точно 0?
BTW, после прочтения http://tldp.org/LDP/abs/html/exitcodes.html я перестал использовать `exit 2`
>if < $PARAM_NUMBER != 2 > ; then
> echo "Wrong parameters number. Please use $ME";
> print_help
>fi
Мне одному кажется, что здесь что-то не так?
>if < ! -d $DIR_1 > ; then
Что произойдёт в случае:
$ mkdir /tmp/Test\ Dir
$ ./this_script_name -f /tmp/Test\ Dir/ -d whatever
?
> exit 0
Точно 0?
BTW, после прочтения http://tldp.org/LDP/abs/html/exitcodes.html я перестал использовать `exit 2`
>if < $PARAM_NUMBER != 2 > ; then
> echo "Wrong parameters number. Please use $ME";
> print_help
>fi
Мне одному кажется, что здесь что-то не так?
>if < ! -d $DIR_1 > ; then
Что произойдёт в случае:
$ mkdir /tmp/Test\ Dir
$ ./this_script_name -f /tmp/Test\ Dir/ -d whatever
?
BTW, после прочтения http://tldp.org/LDP/abs/html/exitcodes.html я перестал использовать `exit 2`
За ссылочку спасибо. Почитал, исправил для соответствия.
>if < $PARAM_NUMBER != 2 > ; then
> echo "Wrong parameters number. Please use $ME";
> print_help
>fi
Мне одному кажется, что здесь что-то не так?
Эм :) Это я тупо по привычке. В QNX для показа справки используется утилита use. Т.е что-то в стиле:
use cp
Поправил короче говоря :).
>if < ! -d $DIR_1 > ; then
Что произойдёт в случае:
$ mkdir /tmp/Test\ Dir
$ ./this_script_name -f /tmp/Test\ Dir/ -d whatever
?
Что произойдёт в случае:
$ mkdir /tmp/Test\ Dir
$ ./this_script_name -f /tmp/Test\ Dir/ -d whatever
?
Ничего. Скрипты выдаст ошибку, что параметр -d не соответствует ожидаемому параметру.
>Ничего. Скрипты выдаст ошибку, что параметр -d не соответствует ожидаемому параметру.
Похоже, Вы не соизволили проверить. Намекну ещё раз: чем отличается поведение скриптов
DIR="somewhat with spaces"
if < -d $DIR >;
и
DIR="somewhat with spaces"
if < -d "$DIR" >;
?
Похоже, Вы не соизволили проверить. Намекну ещё раз: чем отличается поведение скриптов
DIR="somewhat with spaces"
if < -d $DIR >;
и
DIR="somewhat with spaces"
if < -d "$DIR" >;
?