|
Компьютерный форум OSzone.net » Linux и FreeBSD » Программирование в *nix » [решено] Удаление одинаковых файлов |
|
[решено] Удаление одинаковых файлов
|
Ветеран Сообщения: 1384 |
Здравствуйте.
Итак: имеем каталог с подкаталогами в которых находятся текстовые файлы. В каждом файле есть строка ID-(далее идентификатор файла). У всех файлов разные имена. У некоторых совпадают размеры. Нужно удалить все файлы, кроме одного, у которых одинаковые ID. Файлы у которых совпадают размеры - наверняка будут с одинаковым ID (проверено на практике). Нужно написать bash скрипт который это всё будет делать. Я вижу алгоритм примерно так. Нужно выбрать каталог. Посмотреть какие в нём файлы. Составить список файлов с одинаковыми размерами. Взять первый из списка. Посмотреть есть ли в тексте файла ID. Если есть сравнить его со всеми файлами такого же размера. Если ID совпадают удалить второй. Повторять до тех пор пока не пройдём весь список. Перейти в другой подкаталог. С bash я имею дело очень недавно. Пару скриптов по переключению каналов я написал. А как тут быть представляю достаточно плохо (сказывается отсутствие опыта). Прошу помощи с примерами и комментариями. |
|
------- Отправлено: 16:20, 10-12-2010 |
Странный тип Сообщения: 813
|
Профиль | Отправить PM | Цитировать Если есть строчка 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 в родительском каталоге. Это будет работать, только если в именах файлов и каталогов нет пробелов. |
------- Последний раз редактировалось Kent, 11-12-2010 в 12:11. Отправлено: 04:27, 11-12-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1384
|
Профиль | Отправить PM | Цитировать Спасибо за скрипт. Протестирую и скажу что и как.
вот пока искал решение проблемы наткнулся на такую программу 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, 13-12-2010 в 16:15. Отправлено: 15:24, 13-12-2010 | #3 |
Ветеран Сообщения: 1384
|
Профиль | Отправить PM | Цитировать Добрые люди помогли разобраться с программой. проблема была в том что это были жёсткие ссылки
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 Заработало |
------- Отправлено: 16:44, 14-12-2010 | #4 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Ошибка - удаление файлов | demoniac | Microsoft Windows 2000/XP | 23 | 01-09-2010 14:03 | |
CMD/BAT - Удаление старых файлов по имени файлов | Bиктор | Скриптовые языки администрирования Windows | 1 | 19-04-2010 03:37 | |
CMD/BAT - [решено] Удаление одинаковых подпапок из родительской папки | D_Master | Скриптовые языки администрирования Windows | 2 | 28-03-2009 15:08 | |
удаление одинаковых папок в под папках | clop1000 | Хочу все знать | 5 | 17-11-2007 00:51 | |
Поиск одинаковых файлов | Geo55 | Программное обеспечение Windows | 6 | 23-10-2004 10:01 |
|