[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Поиск и удаление дублирующих файлов



> > Какие программы есть на эту тему? Желательно, чтоб можно было
> > посмотреть список файлов-дубляжей и выборочно удалить любой из них.
> > 
> > 
> 
> Моё творение:
> 
> #! /bin/bash
> 
> #       Алгоритм работы скрипта:
> #       1. Составить список файлов
> #       2. Вычислить все md5 суммы файлов

Сходу: это надо делать только после того, как отфильтрованы файлы, чей размер
не совпадает ни с каким другим.  Большие файлы обычно характерны тем, что
шансов на совпадение размера у них немного, а считать даже md5 от них можно
заманаться.

> #       3. Отсортировать список по md5 суммам
> #       4. Пройтись по списку, сравнивая попарно md5 записанные в строках и 
> #          если текущая совпала с предыдущей то вывести обе, но одну пометить file: а другую dup:
> #          А чтобы третья и последующая так же не выдавали метки file: то можно использовать имя файла в предыдущей строке
> #          как флаг, и обнулять его после первого вывода метки file:
> #
> #          в последствии можно отфильтровать полученный список через grep "^dup" и пустить на съедение команде rm
> #
> #       Создаем файл блокировки find_duplicate.process чтобы повторно
> не запустился поиск #       одновременно в этом файле находится фраза,
> описывающая какие действия выполняет скрипт. #       Вот примеры того
> что бывает в этом файле: #       'Построение списка файлов...' 
> #       '23634 of 3974653'
> 
> #
> # fixme: перенаправить stderr в файл
> # такая команда не помогает:
> # 2>$0.errlog
> 
> if [ -e $0.process ]
>         then
>         echo "Already running..."
>         exit
>         fi
> 
> if [ $# -ne 2 ]
>         then
>         echo "Use: $0 <dir> <out_file>"
>         exit
>         fi
> 
> FINDDIR="$1"
> TMPNAME=`tempfile`
> 
> echo 'Построение списка файлов...' > $0.process
> 
>         #       составим список только файлов (исключая директории)
> 
> find $FINDDIR -type f > $TMPNAME.list
> 
>         # отфильтруем не нужные
> 
> cat $TMPNAME.list | grep -v "/Trash/" > $TMPNAME.list2
> mv $TMPNAME.list2 $TMPNAME.list
> 
>         #       определим количество файлов
>         #       для того чтобы отображать сколько файлов уже обработано
> 
> CNT=`grep -c "" $TMPNAME.list`

wc -l

Ну, про то, что твоя программа грохается на файлах, содержащих перевод строки
в имени, я просто в скобках замечу.  Да, это извращение, но это вполне
легитимный символ в имени файла.

-- 
Чушь для ресниц (С)энта


Reply to: