LinuxForum.Fans
Тема

Дубликаты

Автор: Anatoly2012 51 сообщений 9738 просмотров
#343247

Всем привет!
Кто-нибудь может дать "формулу" надежды разобрать 20Гб дубликатов (несколько сот тысяч) текстовых файлов с .html страницами? Уже почти неделю не могу разобрать эту "кучу"... Точнее, надо исключить из поиска некоторые расширения: .gif .js .HLP .tif .TTF .css .ico .INF .ini .PFB, - тогда по-легче будет. FSlint и Fdupes этого не умеют или я чего-то не понял...
Буду очень благодарен!
ОС: Linux Mint

#343250

В общем, самом примитивном случае, как-то так:

text

find SRC -iname "*.html" -exec mv {} DST \;

Эта команда переместит все .html и .HTML файлы из каталога SRC и вложенных в него каталогов в каталог DST.

#343267
"Anatoly2012" написал:
Уже почти неделю не могу разобрать эту "кучу"... Точнее, надо исключить из поиска некоторые расширения: .gif .js .HLP .tif .TTF .css .ico .INF .ini .PFB, - тогда по-легче будет.

man find

пример: найти в текущем каталоге все файлы кроме *.git и *.js

text
find . ! -name "*.git" ! -name "*.js" -ls

пример 2: найти и скопировать найденное в каталог DEST/ с сохранением структуры каталогов

text
find . -type f ! -name "*.git" ! -name "*.js" -exec cp -va --parent -t DEST/ {} +

(единственное, эта команда пустые каталоги не копирует. А вам это нужно?)

#343271

Lupo Alberto, спасибо, но два уточнения:
1. лучше копировать. А то ведь можно и ошибиться.
2. лучше поменять в команде mv/cp местами аргументы

text
mv -t TARGET/ FILE1 FILE2 FILE3...

тогда можно плюсик применить, который как xargs работает.

#343276
"drBatty" написал:
тогда можно плюсик применить, который как xargs работает.

Не было случая проверить, сработает ли "{} +" на таком объёме файлов.

P.S. В любом случае, это была общая рекомендация, man find она не заменит.

#343278
"Lupo Alberto" написал:
Не было случая проверить, сработает ли "{} +" на таком объёме файлов.
у меня был. Сработает.

"Lupo Alberto" написал:
В любом случае, это была общая рекомендация, man find она не заменит.

для более глубокого изучения рекомендую почитать

text
File: find.info,  Node: Top,  Next: Introduction,  Up: (dir)

GNU Findutils *************

В частности, там где-то написано, что плюсик -- тот же xargs, только сокращённо.

#343340

Lupo Alberto и drBatty, спасибо за подсказку!
Только find - это поиск "нужных", т.е. определенных файлов, а надо найти и показать дубликаты, которых много и разбросаны по разным директориям. Но, чтобы убрать из "вида" файлы сотни раз повторяющиеся в интернет страницах (обычно в папках design) и все внимание переключить на другие текстовые файлы-дубликаты, например: .txt, .pdf, .djvu, .dot, .doc, .docx и т.д., желательно в поиске дубликатов исключить некоторые расширения, типа - .gif .js .HLP .tif .TTF .css .ico .INF .ini .PFB ... Может я чего-то не до-понимаю... Подскажите %)

#343343

Anatoly2012, дубликат - это повторяющееся имя файла вашем случае?

#343345
"-=Serj=-" написал:
Anatoly2012, дубликат - это повторяющееся имя файла вашем случае?

Но, имена файлов не указывают их одинаковые размеры, содержание, хеш-сумму... Поэтому и дубликатами их назвать нельзя. Да, и бывают разные имена совершенно одинаковых файлов по содержанию и размеру.

#343347

Anatoly2012, тогда определите точнее, по каким признакам необходимо определять дубликаты.

#343348
"-=Serj=-" написал:
Anatoly2012, тогда определите точнее, по каким признакам необходимо определять дубликаты.

Основной критерий: содержание файла; размер и хеш-сумма - второстепенны.

#343349
"Anatoly2012" написал:
Основной критерий: содержание файла; размер и хеш-сумма - второстепенны.

Но, если содержание одинаково, следовательно и хеш-сумма и размер совпадут.

#343350
"-=Serj=-" написал:
Но, если содержание одинаково, следовательно и хеш-сумма и размер совпадут.

Да, но имена файлов бывают совершенно разные и на разных языках.

#343352

Anatoly2012, тогда ориентир - хеш сумма содержимого файла. Чуть позже могу попробовать накидать скрипт на Python.

#343354
"-=Serj=-" написал:
Чуть позже могу попробовать накидать скрипт на Python.

Заранее благодарен!

#343357

Как-то так:

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_list = [] 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_list: md5_list.append(md5) else: while True: answer = raw_input('Remove %s ? [y/n]' % full_name) if answer == 'y': os.remove(full_name) break elif answer == 'n': break

Запускать

text

$ ./dedup.py <target_dir>

Если не указать целевую директорию, скрипт отрабатывает в текущем каталоге.
Скрипт обойдёт все вложенные директории в target_dir и УДАЛИТ! файлы со встреченной ранее md5-суммой.
Настоятельно рекомендуется резервная копия :)

#343361
"-=Serj=-" написал:
Скрипт обойдёт все вложенные директории в target_dir и УДАЛИТ! файлы со встреченной ранее md5-суммой.

А можно так сделать, чтобы обходил все поддиректории, но выбор оставлял мне, т.е. в какой папке удалить дубликат? *SCRATCH*

#343363
"Anatoly2012" написал:
А можно так сделать, чтобы обходил все поддиректории, но выбор оставлял мне, т.е. в какой папке удалить дубликат?

Т.е., перед удалением файла спрашивал?
ЗЫ. А, чтобы была возможность выбрать, какой файл оставлять за основной?

#343366
"-=Serj=-" написал:
Т.е., перед удалением файла спрашивал?

Да.

"-=Serj=-" написал:
ЗЫ. А, чтобы была возможность выбрать, какой файл оставлять за основной?

Да.

#343369

Эм, либо первый вариант, либо второй)
Сделал пока первый вариант (подправил скрипт выше), но, думаю, вы запаритесь вводить 'y' :)

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