Compare Pastes

Differences between the pastes #164856 (22.02.2021 03:33) and #238226 (28.11.2021 09:32).
1
# fileants
2
Work with your own files
3
4
## Stage 0. Concept development.
5
6
The work will be done in the **ideas** branch.
7
8
## Проблемная область
9
10
Проект не предназначен для файлов, которые представляют для себя высокую степень связанности.
11
Например,репозиторий исходного кода.
12
13
Большинство файлов самодостаточны.
14
А с увеличением устройств растет количество носителей. При этом многие делят пространство на компютере на отдельные хранилища (разделы, жесткие диски).
15
16
Можно, конечно, использовать облачные технологии, но тогда надо иметь или всё в облаке, или держать полную копию облака на носителе.
17
Размеры облаков не достаточны даже для хранения собственных фотографий.
18
19
Рассмотрим пример.
20
Есть планшет.
21
В нем есть SD-карта.
22
Обычно это устройство для получения информации (чтения).
23
Тогда на карту копируется выборка из хранилищ на компьютере.
24
Но иногда на планшете загружаются новые файлы (из интернета или другого источника, например, фотоаппарата).
25
Получается дилемма: или держать эти файлы отдельно от скопированных с компьютера или при синхронизации разбираться в дубликатах.
26
27
Для поиска дубликатов есть достаточно хороших программ,
28
но я не встретил ни одной,
29
чтобы она по предоставленному файлу ответила на вопрос:
30
существует ли в месте хранения его копия.
31
32
Поэтому задумался над созданием данной программы.
33
34
## Текущий подход к решению
35
36
Программа UNIX-like.
37
В смысле организации домашнего каталога.
38
39
  * В `~/.config/fileants` хранится конфигурация.
40
  * В `~/.local/share/fileants` хранится база.
41
42
### Терминология
43
44
Попытаюсь ввести терминологию в проекте.
45
  * Файл - это (**ant**) муравей.
46
  * Группа файлов - это (**swarm**) стая/рой. Муравьи путешествуют как по одиночке, так и стаями/роем.
47
  * Каждый муравей может жить в одном или нескольких муравейниках (**hill**).
48
  * Муравейники могут располагаться в лесу (**forest**).
49
50
Таким образом, у муравья (**ant**) или их стаи (**swarm**) необходимо определить для каждого муравья (**ant**) его места в муравейниках (**hill**).
51
Для поиска можно задать более крупное понятие лес (**hill**) или перечислить несколько лесов.
52
53
### Состав данных
54
55
#### Конфигурация
56
57
В конфигурации содержится:
58
  * общие настройки
59
  * перечень хранилищ hill и forest
60
  * для hill фильтры (исключений) (_пока будут отсутсвовать_)
61
62
#### База
63
64
В базе утилитой сохраняется информация об идексах файлов.
65
66
Одна индексная запись состоит из полей фиксированной длины:
67
  * **размер** файла
68
  * _**дата**_ файла (пока не будет, не понятен запрос, может даже приводить к путанице)
69
  * **первый индекс** - **md5** сумма начала файла (_1K, 32K, 1M ? думаю будет определяться в конфигурации, пока нравится 1M_)
70
  * **второй индекс** - **sha1/sha256/...**(_еще не определися с типом_) более сложная сумма по всему файлу
71
72
и поля произвольной длины:
73
  * имя файла (допустимы все символы, кроме перевода строки, при формировании такие файлы игнорируются и выводится предупреждение)
74
75
```
76
0         2         3         4         5         6         7         8         9
77
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
78
SIZE         MD5                              SHA1                                     path/to/file
79
000000003844 59e4b106ef9bf1d2a5e463386e48e95c 72b94ae268ead055a836b1284dbb2ad017749498 fileants/README.md
80
```
81
82
Индексы нарезаются на файлы.
83
**?Как.**
84
Есть несколько идей.
85
(_В начальном варианте реализации будет единый огромный файл._)
86
87
### Работа
88
89
#### Конфигурация
90
91
В начале работы требуется задать hill.
92
93
~~Каждый hill может содержать несколько путей в файловой системе.~~
94
hill содержит единственный пусть в файловой системе.
95
Это необходимо для исключния этого пути в файлах базы, где они будут указываться в относительном виде.
96
97
Замем можно при необходимости объединить в hill в firest.
98
Суть forest - облегчение ввода типовых задач поиска.
99
100
```
101
fileants --hill
102
fileants --hill mycollection1 --create /path1/to/dir1
103
fileants --hill mycollection2 --create /path2/to/dir2
104
fileants --hill mycollection1 --delete
105
fileants --forest
106
fileants --forest myphoto
107
fileants --forest myphoto --set mycollection1 mycollection2
108
fileants --forest myphoto --add mycollection3
109
fileants --forest myphoto --del mycollection2
110
```
111
112
#### Модификация базы
113
114
Базу можно формирорвать по частям.
115
116
Можно определить уровни:
117
  * **l0** - поиск только по размеру
118
  * **l1** - поиск по размеру и первому идексу
119
  * **l2** - поиск по размеру и двум первым индексам
120
  * **l9** - поиск полного соотвествия по содержимому
121
122
Можно формировать базу с различной нагрузкой на диск.
123
То есть, в некоторых случаях может быть достаточно только размера файла, особенно при использовании при поиска **l9** на мелких файлах.
124
А в других случаях, например для фотоархива, достаточно сравнивать только **l1**.
125
Уровень **l9** хорошо подходит для работы с такими файлами, как ISO образ - если его посчитать, то при сравннии не потребуется производить тяжелое чтение.
126
**l2** можно формировать при **l9** запросах изменяя по ходу работы базу.
127
128
Думаю такой подход с дополненеим индексов возможен и для заполнения остальных индексов.
129
Хотя есть сомнения.
130
Обычно, **l2** требуется для больших файлов >100M, а для средних ~30-60M это будет малоэффективная трата процессорного времени.
131
132
```
133
fileants --hill mycollection1 --update 1
134
fileants --hill myiso --update 0
135
fileants --hill mycollection2 --check 0
136
```
137
138
#### Поиск
139
140
```
141
fileants --hill mycollection1 --file 0 /path/to/my_file
142
fileants --forest myphoto --dir 1 /path/to/my_album
143
fileants --forest myiso --dir 9 /path/to/my_iso_file