Skip to content

Instantly share code, notes, and snippets.

@scifinder
Last active October 2, 2023 17:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save scifinder/567c971d6a7ffa87c85301e6e3087ed0 to your computer and use it in GitHub Desktop.
Save scifinder/567c971d6a7ffa87c85301e6e3087ed0 to your computer and use it in GitHub Desktop.
Патчи для утилит find и cp во FreeBSD, реализующие полноценную работу с расширенными атрибутами
Механизм расширенных атрибутов во FreeBSD (extattr) позволяет управлять дополнительной информацией, связанной с файлом или директорией. При помощи семейства команд setextattr, getextattr и rmextattr можно редактировать расширенные атрибуты файла, принадлежащие к двум пространствам имён: системному и пользовательскому. Редактирование пользовательских атрибутов может пригодиться для классификации файла: добавления описания, ключевых слов и других метаданных. Вот пример использования этих команд.
a) Установить атрибут: user - пользовательское пространство имён, keywords - название атрибута, далее значение и имя файла
$ setextattr user keywords forest,lake,stone 20190621.jpg
b) Прочесть значение атрибута
$ getextattr user keywords 20190621.jpg
20190621.jpg forest,lake,stone
Наиболее очевидный пример использования расширенных атрибутов - классификация файлов при помощи ключевых слов. Однако, механизм расширенных атрибутов во FreeBSD имеет ряд недоработок. В частности, расширенные атрибуты теряются при копировании файлов командой cp. Кроме того, утилита find не умеет осуществлять поиск файлов по их расширенным атрибутам. Без исправления этих недостатков теряет всякий смысл идея классификации и поиска файлов по ключевым словам или краткому описанию.
Для решения возникших препятствий я написал два патча - для утилит cp и find соответственно - исправляющих указанные недостатки.
a) Патч для утилиты find
Применить его можно так (во FreeBSD должны быть установлены исходники):
cd /usr/src/usr.bin/find
patch < /tmp/patch-find.diff
make
make install clean
А использовать так:
find . -userattr keywords=lake
./20190621.jpg
Эта команда найдёт все файлы, у которых атрибут "keywords" содержит подстроку "lake".
b) Патч для утилиты cp
Применяется аналогичным образом:
cd /usr/src/bin/cp
patch < /tmp/patch-cp.diff
make
make install clean
После его применения расширенные атрибуты будут по-умолчанию копироваться вместе с файлом.
Полный код утилит с моими изменениями размещён в репозиториях find и cp.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment