Всем привет!
Кто-нибудь может дать "формулу" надежды разобрать 20Гб дубликатов (несколько сот тысяч) текстовых файлов с .html страницами? Уже почти неделю не могу разобрать эту "кучу"... Точнее, надо исключить из поиска некоторые расширения: .gif .js .HLP .tif .TTF .css .ico .INF .ini .PFB, - тогда по-легче будет. FSlint и Fdupes этого не умеют или я чего-то не понял...
Буду очень благодарен!
ОС: Linux Mint
Дубликаты
В общем, самом примитивном случае, как-то так:
find SRC -iname "*.html" -exec mv {} DST \;
Эта команда переместит все .html и .HTML файлы из каталога SRC и вложенных в него каталогов в каталог DST.
Уже почти неделю не могу разобрать эту "кучу"... Точнее, надо исключить из поиска некоторые расширения: .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/ {} +(единственное, эта команда пустые каталоги не копирует. А вам это нужно?)
Lupo Alberto, спасибо, но два уточнения:
1. лучше копировать. А то ведь можно и ошибиться.
2. лучше поменять в команде mv/cp местами аргументы
mv -t TARGET/ FILE1 FILE2 FILE3...тогда можно плюсик применить, который как xargs работает.
тогда можно плюсик применить, который как xargs работает.
Не было случая проверить, сработает ли "{} +" на таком объёме файлов.
P.S. В любом случае, это была общая рекомендация, man find она не заменит.
у меня был. Сработает.Не было случая проверить, сработает ли "{} +" на таком объёме файлов.
В любом случае, это была общая рекомендация, man find она не заменит.
для более глубокого изучения рекомендую почитать
File: find.info, Node: Top, Next: Introduction, Up: (dir)
GNU Findutils
*************
В частности, там где-то написано, что плюсик -- тот же xargs, только сокращённо.
Lupo Alberto и drBatty, спасибо за подсказку!
Только find - это поиск "нужных", т.е. определенных файлов, а надо найти и показать дубликаты, которых много и разбросаны по разным директориям. Но, чтобы убрать из "вида" файлы сотни раз повторяющиеся в интернет страницах (обычно в папках design) и все внимание переключить на другие текстовые файлы-дубликаты, например: .txt, .pdf, .djvu, .dot, .doc, .docx и т.д., желательно в поиске дубликатов исключить некоторые расширения, типа - .gif .js .HLP .tif .TTF .css .ico .INF .ini .PFB ... Может я чего-то не до-понимаю... Подскажите %)
Anatoly2012, дубликат - это повторяющееся имя файла вашем случае?
Anatoly2012, дубликат - это повторяющееся имя файла вашем случае?
Но, имена файлов не указывают их одинаковые размеры, содержание, хеш-сумму... Поэтому и дубликатами их назвать нельзя. Да, и бывают разные имена совершенно одинаковых файлов по содержанию и размеру.
Anatoly2012, тогда определите точнее, по каким признакам необходимо определять дубликаты.
Anatoly2012, тогда определите точнее, по каким признакам необходимо определять дубликаты.
Основной критерий: содержание файла; размер и хеш-сумма - второстепенны.
Основной критерий: содержание файла; размер и хеш-сумма - второстепенны.
Но, если содержание одинаково, следовательно и хеш-сумма и размер совпадут.
Но, если содержание одинаково, следовательно и хеш-сумма и размер совпадут.
Да, но имена файлов бывают совершенно разные и на разных языках.
Anatoly2012, тогда ориентир - хеш сумма содержимого файла. Чуть позже могу попробовать накидать скрипт на Python.
Чуть позже могу попробовать накидать скрипт на Python.
Заранее благодарен!
Как-то так:
#!/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-суммой.
Настоятельно рекомендуется резервная копия :)
Скрипт обойдёт все вложенные директории в target_dir и УДАЛИТ! файлы со встреченной ранее md5-суммой.
А можно так сделать, чтобы обходил все поддиректории, но выбор оставлял мне, т.е. в какой папке удалить дубликат? *SCRATCH*
А можно так сделать, чтобы обходил все поддиректории, но выбор оставлял мне, т.е. в какой папке удалить дубликат?
Т.е., перед удалением файла спрашивал?
ЗЫ. А, чтобы была возможность выбрать, какой файл оставлять за основной?
Т.е., перед удалением файла спрашивал?
Да.
ЗЫ. А, чтобы была возможность выбрать, какой файл оставлять за основной?
Да.
Эм, либо первый вариант, либо второй)
Сделал пока первый вариант (подправил скрипт выше), но, думаю, вы запаритесь вводить 'y' :)