LINUX.ORG.RU

[xattr][tag][file][search][catalog][indexer] Каталогизатор файлов

 , ,


0

3

Файлов со временем становится всё больше и вот для меня наступил момент когда размещение и поиск файла создаёт массу проблем.

Данный вопрос многократно возникал ( 1 2 3 4 5 )

Обычные каталоги не помогают, система символических ссылок ужасна, комментарии к файлам (read.me, files.bbs, dirinfo, descript.ion) в Linux не поддерживаются, теги в базе данных (например Gnome[Nautilus] ~/.local/share/gvfs-metadata) обрекают на вечную зависимость от одного DE, ScrapBook(Firefox) - будет два места хранения ScrapBook и файловая система (в место одной проблемы - две), файлы в базе данных (DBFS) - отсутствуют вменяемые реализации, можно вообще не хранить файлы (есть google, yandex) или воспользоваться локальными поисковиками, но (Meta)Tracker и Nepomuk тормозят, а Beagle заброшен, теги в виде xattr практически не используются.

Поэтому решил написать простой каталогизатор:

  • K файлам вручную добавляются xattr теги, а также рассчитанные автоматически контрольные суммы.
  • Эта информация дублируется в комментарии к файлу «file.ext.txt» в надежде на некоторую переносимость и возможность индексации Tracker-ом.
  • В данный момент можно создавать теги, добавлять к существующим тегам, осуществлять поиск тегов (причём путь и имя файла также участвуют в оценке рейтинга файла по данному запросу).
  • Для всех команд в консоли (zsh) работает авто-дополнение, но нужно производить индексацию существующих тегов.
  • При добавлении нового файла, его теги автоматически добавляются в индекс.
  • При поиске найденные теги автоматически добавляются в индекс.

Todo (планы на будущее)

  • чистка индексных файлов от неиспользуемых тегов
  • при поиске не отображать «file.ext.txt» если есть файл «file.ext»
  • создать базу данных с файлами и тегами для реактивного поиска и возможности восстановления тегов
  • восстановление тегов (сообщение о различиях) при несовпадении xattr и «file.ext.txt» или несовпадении контрольных сумм
  • использование EXIF и прочей мета-информации из содержимого файлов
  • графический (GTK3) и libastral интерфейс
  • превращение в дракона: величие и прожорливость
  • многочисленные форки, в том числе на C, C++ (Qt5), Python, Ruby и прочих.

исходный код xattr-tag

зависимости:

  • guile (GNU Guile) 2.1.0.48-3c65e (в более ранних версиях наблюдались проблемы с юникодом 1 2)
  • battery-scheme

Как всегда данное решение не панацея, но вдруг кому пригодится.



Последнее исправление: chu_joii (всего исправлений: 2)

Кто же такое на лиспах пишет? На плюсах. И не понтов ради, а перфоманса для.

anonymous
()
Ответ на: комментарий от zolden

До реактивности ещё далеко, тут большое разочарование: segmentation fault при поиске по громадным каталогам (portage 129289 файлов)

поэтому проверял на portage/app-admin (1505 файлов)

  1. time find-xattr-tag.scm portage/app-admin txt > /dev/null
  2. time find portage/app-admin -exec getfattr -e "text" -n user.metatag {} \; 2>/dev/null | grep txt >/dev/null
  3. time find portage/app-admin -exec sh -c "getfattr -e \"text\" -n user.metatag {} 2>/dev/null | grep txt" \; >/dev/null
  4. time getfattr -e "text" -n user.metatag portage/app-admin/**/* 2>/dev/null | grep txt >/dev/null
    кстати спасибо за «рекурсивный глоббинг»

после каждой проверки - перезагрузка

для 1505 (последний столбец - отличие от наилучшего времени):

1	1.44s user 1.20s system 14% cpu 17.697 total	38 раз
2	0.00s user 0.00s system  0% cpu  3.097 total	 7 раз
3	0.01s user 0.34s system  3% cpu 11.277 total	24 раз
4	0.00s user 0.00s system  0% cpu  0.470 total	 1 раз

для 3010 (файлов стало в два раза больше так как добавились дублирующие *.txt):

1*  	4.59s user 2.57s system 20% cpu 35.393 total	80 раз
2*	0.03s user 0.02s system  0% cpu  5.259 total	12 раз
3*	0.13s user 0.48s system  3% cpu 19.808 total	45 раз
4*	0.01s user 0.00s system  2% cpu  0.449 total	 1 раз

chu_joii
() автор топика
Ответ на: комментарий от anonymous

Я написал эту программу скорее в самообразовательных целях: изучаю lisp вот и нужно на чём-то практиковаться, а если в результате написания будет какая-то практическая польза так вообще хорошо.

chu_joii
() автор топика

guile (GNU Guile) 2.1.0.48-3c65e

Это же из гита собирать, костыля для 2.0.5 (он хотя бы есть на gnu.org) нет?

anonymous
()
Ответ на: комментарий от anonymous

программа будет работать и в ранних версиях guile, однако:

  • один баг влияет на получаемую после команды system кодировку строки, и
    • может быть исправлен (по ссылке приводится патч) в guile;
    • либо его можно обойти, не используя результат возвращения команды system (через перенаправление вывода в временный файл). Для этого нужно закомментировать в файле battery-scheme/system-cmd.scm первую функцию (начинается с (define (system-with-output-to-string command)... ) и раскомментировать вторую.
  • другой баг влияет на передаваемые при запуске (int argc, char **argv) из командной строки символы. Соответственно, не получится передать программе путь и теги в отличной от ASCII кодировке. Поэтому в старой версии guile установить юникодные параметры (теги или имя файла) можно только вручную через setfattr.

    Его тоже можно исправить патчем: здесь он упоминается. но мне было легче раскомментировать git версию в gentoo.

chu_joii
() автор топика
Ответ на: комментарий от anonymous

Контрольные суммы хранятся в таком виде:

user.checksum.md5="7ee569f4dec19c7e0b47aabb7048e229"
user.checksum.sha1="59123ebaf44e8556ab2e36ad288745b0da174afa"
user.checksum.sha256="58a193b59947ec22b752df17932e37207783d1cf593f1620bb866b06c45a1fe5"

Под именем user.metatag в качестве значения хранится список тегов через пробел

user.metatag="foo bar"

Если тег содержит символы в кодировке отличной от ASCII, то setfattr автоматически превращает их в base64

user.metatag=0sdmVyeSBzdHJhbmdlINC/0YDQvtCy0LXRgNC60LAgdXRmLTg=

Однако, при чтении (getfattr -e «text») можно их просмотреть в первоначальном виде

user.metatag="very strange проверка utf-8"

Для файла «file.ext» создаётся «file.ext.txt» (расширение ".txt" можно изменить в файле настроек ~/.config/xattr-tag/xattr-config.scm), содержащий дамп xattr в том виде, в котором его выдаёт команда

getfattr -e "text" -d file.ext

Файл ~/.cache/xattr-tag/list-xattr-tag.scm содержит список тегов в виде S-выражения. Файл дополняется тегами найденными при поиске, а также тегами участвующими при создании и добавлении.

Файл ~/.config/zsh/completion/_xattr-tag оформлен в соответствии со справкой по zsh и содержит тот же список тегов, что и в файле ~/.cache/xattr-tag/list-xattr-tag.scm

chu_joii
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.