LinuxForum.Fans
Тема

Дубликаты

Автор: Anatoly2012 51 сообщений 9737 просмотров
#343866
"-=Serj=-" написал:
Anatoly2012, какие требования?

Чтобы скрипт показывал 2, 3... дубликата и выбор какой файл удалить.

#343867

drBatty, ваши аргументы не могу оспаривать, но мне проще было через скрипт... пока так понятнее :)

#343885
"drBatty" написал:
намекаете на то, что питон умеет регулярки?

Да не, просто на незавершенность :)

#343889
"Anatoly2012" написал:
но мне проще было через скрипт... пока так понятнее
find это тоже такой "скрипт" недоделанный. Но для поиска и обработки файлов лучше не бывает.

Если вы думаете, что изучать find не нужно, идите лучше в дворники. Хотя нет, лучше менеджером. Может получится с лозунгом "питона хватит всем!". Ну у BG получилось же! *CRAZY*

"-=Serj=-" написал:
Да не, просто на незавершенность

мне эта команда даром не нужна.

#343893
"drBatty" написал:
Если вы думаете, что изучать find не нужно, идите лучше в дворники. Хотя нет, лучше менеджером. Может получится с лозунгом "питона хватит всем!".

А нафига мешать в кучу знание команд Linux и ЯП?

"drBatty" написал:
мне эта команда даром не нужна.

Какая команда? Я говорил про то, чтобы добавить в тот однострок фильтрацию по расширениям.

#343912
"drBatty" написал:
find это тоже такой "скрипт"
"-=Serj=-" написал:
А нафига мешать в кучу знание команд Linux и ЯП?

а в чём разница?

"-=Serj=-" написал:
Какая команда? Я говорил про то, чтобы добавить в тот однострок фильтрацию по расширениям.
добавьте, кто вам не даёт-то?
#343990

drBatty, к сожалению, у меня не хватает умения для дальнейшего развития демагогии.

Anatoly2012, если извращённо, то как-то так) :

text

#!/usr/bin/env python
#_*_ coding: utf-8 _*_

import os import hashlib import sys

ignore_list = ['.gif', '.js', '.HLP', '.tif', '.css', '.ico', '.INF', '.ini', '.PFB']

try: work_path = sys.argv[1] except: work_path = '.'

md5_dic = {} dirTree = os.walk(work_path)

def getMd5sum(fname): with open(fname) as f: return hashlib.md5(f.read()).hexdigest()

for dirPath, dirNames, Files in dirTree: for f in Files: if os.path.splitext(f)[1] in ignore_list: continue full_name = os.path.join(os.path.abspath(dirPath), f) md5 = getMd5sum(full_name) if md5 not in md5_dic: md5_dic[md5] = [] md5_dic[md5].append(full_name) else: md5_dic[md5].append(full_name) md5_dic = dict((key, val) for key, val in md5_dic.items() if len(val) > 1)

group_num = len(md5_dic) print('Number of groups duplicate files: %d' % group_num) i = 1 for key, val in md5_dic.items(): print('\nGroup %d of %d:' % (i, group_num)) for f in val: print('%5d %s' % (val.index(f) + 1, f)) print('') while True: answer = raw_input('Enter file numbers to delete (e.g. 1,3,4). Enter "next" for next group or "exit" to close program.\n> ') if answer.strip().lower() == 'next': break elif answer.strip().lower() == 'exit': sys.exit(0) try: numbers_to_del = set([int(item.strip()) for item in answer.split(',')]) except: print('Error: wrong values!') continue if numbers_to_del & set(range(1, len(val) + 1)) != numbers_to_del: print('Error: wrong values!') continue print('Delete these files?\n') files_to_del = [val[j -1] for j in numbers_to_del] for ftd in files_to_del: print(ftd) while True: answer2 = raw_input('\nEnter "yes" or "no":\n> ') if answer2.lower() == "yes": for ftd in files_to_del: os.remove(ftd) break elif answer2.lower() == "no": break else: print('Wrong answer!') continue break i += 1

text

$ ./dedup.py target/
Number of groups duplicate files: 2

Group 1 of 2: 1 /mnt/sandbox/Python/files_dedup/target/folder3/fille3.txt 2 /mnt/sandbox/Python/files_dedup/target/folder4/fille3.txt

Enter file numbers to delete (e.g. 1,3,4). Enter "next" for next group or "exit" to close program. > next

Group 2 of 2: 1 /mnt/sandbox/Python/files_dedup/target/folder1/file1.txt 2 /mnt/sandbox/Python/files_dedup/target/folder2/file1_copy.txt

Enter file numbers to delete (e.g. 1,3,4). Enter "next" for next group or "exit" to close program. > 2 Delete these files?

/mnt/sandbox/Python/files_dedup/target/folder2/file1_copy.txt

Enter "yes" or "no": > yes

ЗЫ. Если по-проще, то, наверное, приведёнными выше командами скинуть имена в файл и уже дальше с ним работать.

#344066

"-=Serj=-" написал:
к сожалению, у меня не хватает умения для дальнейшего развития демагогии.
кроме демагогии есть опыт. Опыт говорит мне, что на некоторых серверах в некоторых продакшенах питона тупо НЕТ. Что вы станете делать в таком практическом случае?
#344069
"drBatty" написал:
Опыт говорит мне, что на некоторых серверах в некоторых продакшенах питона тупо НЕТ. Что вы станете делать в таком практическом случае?

Ну, это аргумент, да... Хотя, неужели нельзя обеспечить безопасность? Тем же bash, perl или php можно дров наломать...
А с третьей стороны, если ты сисадмин, то, хотя бы, основы баш знать, наверное, должен. Мы же python с bash сравниваем, а не с командами?

#346169
"-=Serj=-" написал:
Anatoly2012, ... как-то так) :

Все отлично работает!!! *YAHOO* Еще раз спасибо огромное! *YES* Все сделал, предоволен... За паузу простите, работа...

В скрипте немножко подправил: "next" на "-", "yes" на "y", "no" на "n", и все быстро получилось. Когда попадались два-три дубликата, то meld'ом сравнивал обе директории и одну из них удалял.

P.S. Можно было бы добавить в скрипт строку завершения, например: "поиск завершен", а то, если нет дубликатов в файле скрипт исчезает, - сразу и не поймешь чего это.

#346928
"-=Serj=-" написал:
Хотя, неужели нельзя обеспечить безопасность? Тем же bash, perl или php можно дров наломать...
это не мои сервера. Тамошние админы считают, что от perl'а вреда нет, а вот от питона есть. Школьники шалят. А перловку им не осилить.

"-=Serj=-" написал:
А с третьей стороны, если ты сисадмин, то, хотя бы, основы баш знать, наверное, должен. Мы же python с bash сравниваем, а не с командами?

я не понимаю, как сисадмин умудрился не знать команду find??? Да ну и что, что он умеет на каком-то brainfuck'е писать скрипты для поиска?

При чём тут именно bash? Я про find говорил, а не про bash, а вы занимаетесь демагогией, пытаясь перевести стрелки на спор bash vs python.

Если задача решаема одной командой(find в данном случае), то и решать нужно этой командой, а не городить кривые велосипеды с квадратными колёсами на питоне.

Войдите или зарегистрируйтесь, чтобы ответить.