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 |
