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 |