Tonny_Bennet
10-12-2010, 16:20
Здравствуйте.
Итак: имеем каталог с подкаталогами в которых находятся текстовые файлы. В каждом файле есть строка ID-(далее идентификатор файла). У всех файлов разные имена. У некоторых совпадают размеры. Нужно удалить все файлы, кроме одного, у которых одинаковые ID. Файлы у которых совпадают размеры - наверняка будут с одинаковым ID (проверено на практике).
Нужно написать bash скрипт который это всё будет делать.
Я вижу алгоритм примерно так.
Нужно выбрать каталог.
Посмотреть какие в нём файлы.
Составить список файлов с одинаковыми размерами.
Взять первый из списка.
Посмотреть есть ли в тексте файла ID.
Если есть сравнить его со всеми файлами такого же размера.
Если ID совпадают удалить второй.
Повторять до тех пор пока не пройдём весь список.
Перейти в другой подкаталог.
С bash я имею дело очень недавно. Пару скриптов по переключению каналов я написал. А как тут быть представляю достаточно плохо (сказывается отсутствие опыта).
Прошу помощи с примерами и комментариями.
Если есть строчка 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
Спасибо за скрипт. Протестирую и скажу что и как.
вот пока искал решение проблемы наткнулся на такую программу 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
Добрые люди помогли разобраться с программой. проблема была в том что это были жёсткие ссылки
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
Заработало
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC