Anatoly2012, какие требования?
Чтобы скрипт показывал 2, 3... дубликата и выбор какой файл удалить.
Anatoly2012, какие требования?
Чтобы скрипт показывал 2, 3... дубликата и выбор какой файл удалить.
drBatty, ваши аргументы не могу оспаривать, но мне проще было через скрипт... пока так понятнее :)
намекаете на то, что питон умеет регулярки?
Да не, просто на незавершенность :)
find это тоже такой "скрипт" недоделанный. Но для поиска и обработки файлов лучше не бывает.но мне проще было через скрипт... пока так понятнее
Да не, просто на незавершенность
мне эта команда даром не нужна.
Если вы думаете, что изучать find не нужно, идите лучше в дворники. Хотя нет, лучше менеджером. Может получится с лозунгом "питона хватит всем!".
А нафига мешать в кучу знание команд Linux и ЯП?
мне эта команда даром не нужна.
Какая команда? Я говорил про то, чтобы добавить в тот однострок фильтрацию по расширениям.
find это тоже такой "скрипт"
А нафига мешать в кучу знание команд Linux и ЯП?
а в чём разница?
добавьте, кто вам не даёт-то?Какая команда? Я говорил про то, чтобы добавить в тот однострок фильтрацию по расширениям.
drBatty, к сожалению, у меня не хватает умения для дальнейшего развития демагогии.
Anatoly2012, если извращённо, то как-то так) :
#!/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
$ ./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
ЗЫ. Если по-проще, то, наверное, приведёнными выше командами скинуть имена в файл и уже дальше с ним работать.
кроме демагогии есть опыт. Опыт говорит мне, что на некоторых серверах в некоторых продакшенах питона тупо НЕТ. Что вы станете делать в таком практическом случае?к сожалению, у меня не хватает умения для дальнейшего развития демагогии.
Опыт говорит мне, что на некоторых серверах в некоторых продакшенах питона тупо НЕТ. Что вы станете делать в таком практическом случае?
Ну, это аргумент, да... Хотя, неужели нельзя обеспечить безопасность? Тем же bash, perl или php можно дров наломать...
А с третьей стороны, если ты сисадмин, то, хотя бы, основы баш знать, наверное, должен. Мы же python с bash сравниваем, а не с командами?
Anatoly2012, ... как-то так) :
Все отлично работает!!! *YAHOO* Еще раз спасибо огромное! *YES* Все сделал, предоволен... За паузу простите, работа...
В скрипте немножко подправил: "next" на "-", "yes" на "y", "no" на "n", и все быстро получилось. Когда попадались два-три дубликата, то meld'ом сравнивал обе директории и одну из них удалял.
P.S. Можно было бы добавить в скрипт строку завершения, например: "поиск завершен", а то, если нет дубликатов в файле скрипт исчезает, - сразу и не поймешь чего это.
это не мои сервера. Тамошние админы считают, что от perl'а вреда нет, а вот от питона есть. Школьники шалят. А перловку им не осилить.Хотя, неужели нельзя обеспечить безопасность? Тем же bash, perl или php можно дров наломать...
А с третьей стороны, если ты сисадмин, то, хотя бы, основы баш знать, наверное, должен. Мы же python с bash сравниваем, а не с командами?
я не понимаю, как сисадмин умудрился не знать команду find??? Да ну и что, что он умеет на каком-то brainfuck'е писать скрипты для поиска?
При чём тут именно bash? Я про find говорил, а не про bash, а вы занимаетесь демагогией, пытаясь перевести стрелки на спор bash vs python.
Если задача решаема одной командой(find в данном случае), то и решать нужно этой командой, а не городить кривые велосипеды с квадратными колёсами на питоне.