Пост #164856

     
сохранен 22.02.2021 03:33
  • Редактировать пост
  • Печать
  • Скачать
  • Посты-ответы на этот пост:  # 238226
  • Посмотреть дерево постов
  • Сравнить с постом
    #  
  • Нумерация строк
  • Подсветка синтаксиса  
Текст поста
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# fileants
Work with your own files

## Stage 0. Concept development.

The work will be done in the **ideas** branch.

## Проблемная область

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

Большинство файлов самодостаточны.
А с увеличением устройств растет количество носителей. При этом многие делят пространство на компютере на отдельные хранилища (разделы, жесткие диски).

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

Рассмотрим пример.
Есть планшет.
В нем есть SD-карта.
Обычно это устройство для получения информации (чтения).
Тогда на карту копируется выборка из хранилищ на компьютере.
Но иногда на планшете загружаются новые файлы (из интернета или другого источника, например, фотоаппарата).
Получается дилемма: или держать эти файлы отдельно от скопированных с компьютера или при синхронизации разбираться в дубликатах.

Для поиска дубликатов есть достаточно хороших программ,
но я не встретил ни одной,
чтобы она по предоставленному файлу ответила на вопрос:
существует ли в месте хранения его копия.

Поэтому задумался над созданием данной программы.

## Текущий подход к решению

Программа UNIX-like.
В смысле организации домашнего каталога.

  * В `~/.config/fileants` хранится конфигурация.
  * В `~/.local/share/fileants` хранится база.

### Терминология

Попытаюсь ввести терминологию в проекте.
  * Файл - это (**ant**) муравей.
  * Группа файлов - это (**swarm**) стая/рой. Муравьи путешествуют как по одиночке, так и стаями/роем.
  * Каждый муравей может жить в одном или нескольких муравейниках (**hill**).
  * Муравейники могут располагаться в лесу (**forest**).

Таким образом, у муравья (**ant**) или их стаи (**swarm**) необходимо определить для каждого муравья (**ant**) его места в муравейниках (**hill**).
Для поиска можно задать более крупное понятие лес (**hill**) или перечислить несколько лесов.

### Состав данных

#### Конфигурация

В конфигурации содержится:
  * общие настройки
  * перечень хранилищ hill и forest
  * для hill фильтры (исключений) (_пока будут отсутсвовать_)

#### База

В базе утилитой сохраняется информация об идексах файлов.

Одна индексная запись состоит из полей фиксированной длины:
  * **размер** файла
  * _**дата**_ файла (пока не будет, не понятен запрос, может даже приводить к путанице)
  * **первый индекс** - **md5** сумма начала файла (_1K, 32K, 1M ? думаю будет определяться в конфигурации, пока нравится 1M_)
  * **второй индекс** - **sha1/sha256/...**(_еще не определися с типом_) более сложная сумма по всему файлу

и поля произвольной длины:
  * имя файла (допустимы все символы, кроме перевода строки, при формировании такие файлы игнорируются и выводится предупреждение)

```
0         2         3         4         5         6         7         8         9
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
SIZE         MD5                              SHA1                                     path/to/file
000000003844 59e4b106ef9bf1d2a5e463386e48e95c 72b94ae268ead055a836b1284dbb2ad017749498 fileants/README.md
```

Индексы нарезаются на файлы.
**?Как.**
Есть несколько идей.
(_В начальном варианте реализации будет единый огромный файл._)

### Работа

#### Конфигурация

В начале работы требуется задать hill.

~~Каждый hill может содержать несколько путей в файловой системе.~~
hill содержит единственный пусть в файловой системе.
Это необходимо для исключния этого пути в файлах базы, где они будут указываться в относительном виде.

Замем можно при необходимости объединить в hill в firest.
Суть forest - облегчение ввода типовых задач поиска.

```
fileants --hill
fileants --hill mycollection1 --create /path1/to/dir1
fileants --hill mycollection2 --create /path2/to/dir2
fileants --hill mycollection1 --delete
fileants --forest
fileants --forest myphoto
fileants --forest myphoto --set mycollection1 mycollection2
fileants --forest myphoto --add mycollection3
fileants --forest myphoto --del mycollection2
```

#### Модификация базы

Базу можно формирорвать по частям.

Можно определить уровни:
  * **l0** - поиск только по размеру
  * **l1** - поиск по размеру и первому идексу
  * **l2** - поиск по размеру и двум первым индексам
  * **l9** - поиск полного соотвествия по содержимому

Можно формировать базу с различной нагрузкой на диск.
То есть, в некоторых случаях может быть достаточно только размера файла, особенно при использовании при поиска **l9** на мелких файлах.
А в других случаях, например для фотоархива, достаточно сравнивать только **l1**.
Уровень **l9** хорошо подходит для работы с такими файлами, как ISO образ - если его посчитать, то при сравннии не потребуется производить тяжелое чтение.
**l2** можно формировать при **l9** запросах изменяя по ходу работы базу.

Думаю такой подход с дополненеим индексов возможен и для заполнения остальных индексов.
Хотя есть сомнения.
Обычно, **l2** требуется для больших файлов >100M, а для средних ~30-60M это будет малоэффективная трата процессорного времени.

```
fileants --hill mycollection1 --update 1
fileants --hill myiso --update 0
fileants --hill mycollection2 --check 0
```

#### Поиск

```
fileants --hill mycollection1 --file 0 /path/to/my_file
fileants --forest myphoto --dir 1 /path/to/my_album
fileants --forest myiso --dir 9 /path/to/my_iso_file
```
Добавить комментарий
Автор