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

2 (12.10.2013 09:28:31 отредактировано Lupo Alberto)

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

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

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

Был, был и весь вышел...

3 (12.10.2013 10:40:08 отредактировано drBatty)

Anatoly2012 пишет:

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

man find

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

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

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

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

4

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

mv -t TARGET/ FILE1 FILE2 FILE3...

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

5 (12.10.2013 10:55:06 отредактировано Lupo Alberto)

drBatty пишет:

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

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

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

Был, был и весь вышел...

6

Lupo Alberto пишет:

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

у меня был. Сработает.

Lupo Alberto пишет:

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

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

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

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

7

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

8

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

Да, у меня Ubuntu.
Нет, не глючит.

9 (12.10.2013 18:34:53 отредактировано Anatoly2012)

-=Serj=- пишет:

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

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

10

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

Да, у меня Ubuntu.
Нет, не глючит.

11

-=Serj=- пишет:

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

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

12

Anatoly2012 пишет:

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

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

Да, у меня Ubuntu.
Нет, не глючит.

13

-=Serj=- пишет:

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

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

14

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

Да, у меня Ubuntu.
Нет, не глючит.

15

-=Serj=- пишет:

Чуть позже могу попробовать накидать скрипт на Python.

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

16 (12.10.2013 21:04:19 отредактировано -=Serj=-)

Как-то так:

#!/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

Запускать

$ ./dedup.py <target_dir>

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

Да, у меня Ubuntu.
Нет, не глючит.

17

-=Serj=- пишет:

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

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

18 (12.10.2013 20:35:39 отредактировано -=Serj=-)

Anatoly2012 пишет:

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

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

Да, у меня Ubuntu.
Нет, не глючит.

19

-=Serj=- пишет:

Т.е., перед удалением файла спрашивал?

Да.

-=Serj=- пишет:

ЗЫ. А, чтобы была возможность выбрать, какой файл оставлять за основной?

Да.

20 (12.10.2013 21:07:35 отредактировано -=Serj=-)

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

Да, у меня Ubuntu.
Нет, не глючит.

21 (12.10.2013 22:09:39 отредактировано Anatoly2012)

С П А С И Б О  Т Е Б Е  О Г Р О М Н О Е, ДОБРЫЙ ЧЕЛОВЕК!!!
За 4-5 мин. удалил почти 1000 дубликатов, правда в теститруемой папке, где заранее знал где и в какой папке дубликаты лучше удалять. Но, это уже большой прогресс + нервы спокойны и здоровье на другие добрые дела еще пригодится.

-=Serj=- пишет:

Запускать

$ ./dedup.py <target_dir>

Так не сработал почему-то, а в самой директории отлично справился!!!  ay
Еще бы немного усовершенствовать (по второму варианту) скрипт и цены бы ему не было. А, главное респект и уважение автору! az

22

-=Serj=- пишет:

думаю, вы запаритесь вводить 'y'

После почти недельной "запарке" - это как бальзам на душу!

23

Anatoly2012 пишет:

Так не сработал почему-то, а в самой директории отлично справился!!!

Путь полный указывали?

Anatoly2012 пишет:

Еще бы немного усовершенствовать (по второму варианту)

Возможно, удобнее будет, если сначала создать списки повторяющихся файлов, а затем выполнять с ними какие-либо действия... Если необходимо, могу, по-возможности, допилить.

Да, у меня Ubuntu.
Нет, не глючит.

24

-=Serj=- пишет:

Путь полный указывали?

Да, указывал.

-=Serj=- пишет:

Возможно, удобнее будет, если сначала создать списки повторяющихся файлов

Т.е. по расширениям? Всего не предусмотришь, но основные можно... если правильно понял.

-=Serj=- пишет:

Если необходимо, могу, по-возможности, допилить.

ОЧЕНЬ необходимо! думаю не мне только, особенно после сбоев накопителей и восстановления инфы, накопления и чистки излишней информации и т.п.

25

Anatoly2012 пишет:

Т.е. по расширениям?

Не, программа сначала пробегается по каталогам и создаёт списки файлов, у которых совпадает md5, после чего делай с файлами что угодно.

Да, у меня Ubuntu.
Нет, не глючит.

26

Anatoly2012 пишет:

Основной критерий: содержание файла

можно проще сделать

$ find . -type f -exec md5sum {} \; | sort | uniq -w32 -d

эта команда показывает ТОЛЬКО те имена файлов, содержимое которых повторяется. Также она показывает их хеш.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

27

-=Serj=- пишет:

Не, программа сначала пробегается по каталогам и создаёт списки файлов, у которых совпадает md5

$ find . -type f -exec md5sum {} \; | sort | uniq -w32 -D

зачем нужен ваш питон?

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

28 (13.10.2013 11:33:29 отредактировано -=Serj=-)

drBatty пишет:

зачем нужен ваш питон?

Пойду выкину его в помойку. Однако, до этого места

-=Serj=- пишет:

Не, программа сначала пробегается по каталогам и создаёт списки файлов, у которых совпадает md5, после чего делай с файлами что угодно.

всё было не так очевидно.

Маленькое уточнение:

Anatoly2012 пишет:

исключить некоторые расширения, типа - .gif  .js .HLP .tif .TTF .css .ico .INF .ini .PFB

Да, у меня Ubuntu.
Нет, не глючит.

29

-=Serj=- пишет:

Маленькое уточнение:

Ещё одно маленькое уточнение — find тоже может исключать из поиска по маске имени.

Был, был и весь вышел...

30

Lupo Alberto пишет:

Ещё одно маленькое уточнение — find тоже может исключать из поиска по маске имени.

Да, выше уже приводилось:

drBatty пишет:

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

Да, у меня Ubuntu.
Нет, не глючит.