Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование в *nix (http://forum.oszone.net/forumdisplay.php?f=35)
-   -   [решено] Удаление одинаковых файлов (http://forum.oszone.net/showthread.php?t=193587)

Tonny_Bennet 10-12-2010 16:20 1562708

Удаление одинаковых файлов
 
Здравствуйте.

Итак: имеем каталог с подкаталогами в которых находятся текстовые файлы. В каждом файле есть строка ID-(далее идентификатор файла). У всех файлов разные имена. У некоторых совпадают размеры. Нужно удалить все файлы, кроме одного, у которых одинаковые ID. Файлы у которых совпадают размеры - наверняка будут с одинаковым ID (проверено на практике).

Нужно написать bash скрипт который это всё будет делать.

Я вижу алгоритм примерно так.

Нужно выбрать каталог.
Посмотреть какие в нём файлы.
Составить список файлов с одинаковыми размерами.
Взять первый из списка.
Посмотреть есть ли в тексте файла ID.
Если есть сравнить его со всеми файлами такого же размера.
Если ID совпадают удалить второй.
Повторять до тех пор пока не пройдём весь список.
Перейти в другой подкаталог.

С bash я имею дело очень недавно. Пару скриптов по переключению каналов я написал. А как тут быть представляю достаточно плохо (сказывается отсутствие опыта).

Прошу помощи с примерами и комментариями.

Kent 11-12-2010 04:27 1563075

Если есть строчка ID-, то размеры не нужны. Нужно сделать поиск по строке, а потом обработать результаты.

Я не сильный специалист. Вот что получилось:

id-dupes.sh
Код:

#!/bin/sh

# Создаём заголовок для скрипта удаления
echo "#!/bin/sh" > rem-id.sh

# Выводим список файлов с ID
grep -R "ID-" $1 | \

# Сортируем по второму полю (ID)
sort -t":" -k2 | \

# Заменяем ":" на пробелы и добавляем "rm " в начало каждой строки
sed 's/:/ /g;s/^/rm /g' | \

# Находим повторяющиеся значения в третьем поле (ID) и выводим дубликаты
# кроме первого файла
uniq -f 2 -D -u | \

# Перенаправляем два первых поля (rm и имя файла) в скрипт удаления
cut -d " " -f 1,2  >> rem-id.sh

# Назначаем исполняемый атрибут
chmod +x rem-id.sh

exit

Запускать
id-dupes.sh <каталог_с_файлами>

Потом выполнить rem-id.sh в родительском каталоге.

Это будет работать, только если в именах файлов и каталогов нет пробелов.

Tonny_Bennet 13-12-2010 15:24 1564856

Спасибо за скрипт. Протестирую и скажу что и как.

вот пока искал решение проблемы наткнулся на такую программу http://ru.wikipedia.org/wiki/Fdupes но она как то криво работает. По идее она сравнивает 2 файла используя md5sum. Я запускаю программу в каталоге где заведомо есть 2 одинаковых файла. Когда руками сравниваю их суммы - они одинаковые а вот Fdupes их не находит.

В чём может быть косяк не подскажите?



max@mail:~$ ls -la ./test
-rw-rw-rw- 2 root root 17890 2010-12-13 13:15 1292235300.M968450P952.mail,W=18195,S=17890:2,ST
max@mail:~$ sudo md5sum ./test/1292235300.M935468P30122.mail,W=18195,S=17890:2,Sd
a9ffcfb1b8dbab357ccd0e756fac7930 ./test/1292235300.M935468P30122.mail,W=18195,S=17890:2,Sd
max@mail:~$ sudo md5sum ./test/1292235300.M968450P952.mail,W=18195,S=17890:2,ST
a9ffcfb1b8dbab357ccd0e756fac7930 ./test/1292235300.M968450P952.mail,W=18195,S=17890:2,ST
max@mail:~$ sudo fdupes -N -d -R ./test
max@mail:~$

Tonny_Bennet 14-12-2010 16:44 1565722

Добрые люди помогли разобраться с программой. проблема была в том что это были жёсткие ссылки

max@mail:~$ ls -i ./test
9306353 1292226338.M541220P30122.mail,W=37716,S=37165:2,d
9306353 1292226338.M598265P29618.mail,W=37716,S=37165:2,ST
9306354 1292228430.M563987P30122.mail,W=47115,S=46445:2,ad
9306354 1292228430.M566001P29618.mail,W=47115,S=46445:2,ad
9306355 1292229249.M327689P30122.mail,W=7163,S=6995:2,a
9306355 1292229249.M401242P29618.mail,W=7163,S=6995:2,ST
9306356 1292229840.M667082P30122.mail,W=7942,S=7754:2,a
9306356 1292229840.M746282P29618.mail,W=7942,S=7754:2,ST
9306357 1292232068.M880728P30122.mail,W=3320,S=3247:2,a
9306357 1292232068.M884892P29618.mail,W=3320,S=3247:2,a
9306358 1292235300.M935468P30122.mail,W=18195,S=17890:2,Sd
9306358 1292235300.M968450P952.mail,W=18195,S=17890:2,ST

Нашёл в мануале

-H --hardlinks
normally, when two or more files point to the same disk area
they are treated as non-duplicates; this option will change this
behavior

выполнил max@mail:~$ sudo fdupes -N -d -H -R ./test

получил

9306348 1292220330.M350171P29618.mail,W=59637,S=58699:2,a
9306350 1292220330.M350173P29618.mail,W=67005,S=66082:2,a
9306352 1292220330.M350175P29618.mail,W=20093,S=19789:2,a
9306353 1292226338.M598265P29618.mail,W=37716,S=37165:2,ST
9306354 1292228430.M563987P30122.mail,W=47115,S=46445:2,ad
9306355 1292229249.M401242P29618.mail,W=7163,S=6995:2,ST
9306356 1292229840.M746282P29618.mail,W=7942,S=7754:2,ST
9306357 1292232068.M880728P30122.mail,W=3320,S=3247:2,a
9306358 1292235300.M935468P30122.mail,W=18195,S=17890:2,Sd


Заработало


Время: 09:39.

Время: 09:39.
© OSzone.net 2001-