Crates.io | mattress |
lib.rs | mattress |
version | 0.2.1 |
source | src |
created_at | 2023-08-02 21:09:58.133209 |
updated_at | 2023-08-03 03:35:52.443778 |
description | A command line tool for working with Linux extended attributes (xattrs) |
homepage | |
repository | |
max_upload_size | |
id | 933120 |
size | 69,061 |
The comfiest way to work with Linux extended attributes (xattrs) written in pure Rust and made of delicious, fibrous Open Source code.
Mattress provides tools for manipulating xattrs on individual files as well as for working with the filesystem as a document database where the filesystem paths act as primary keys and extended attributes provide non-indexed fields.
Mattress was developed in conjunction with the Audiotater audio annotation tool.
This software is licensed under GPL version 3 only.
Mattress operates through a set of subcommands, each with a primary function.
Moves xattr values from one path to another.
mtr mv path1.txt path2.txt
: move all xattrs from path1.txt to path2.txtmtr mv -f id path1.txt path2.txt
: move xattr id
from path1.txt to path2.txtmtr mv -f id -f url path1.txt path2.txt
: move xattrs id
and url
from path1.txt to path2.txtCopies xattr values from one path to another.
mtr cp path1.txt path2.txt
: copy all xattrs from path1.txt to path2.txtmtr cp -f id path1.txt path2.txt
: copy xattr id
from path1.txt to path2.txtmtr cp -f id -f url path1.txt path2.txt
: copy xattrs id
and url
from path1.txt to path2.txtRemoves xattr values.
mtr rm path.txt
: remove all xattrs on path.txtmtr rm -f id path.txt
: remove xattr id
from path.txtmtr rm -f id -f url path1.txt path2.txt path3.txt
: remove xattrs id
and url
from path1.txt, path2.txt, and path3.txtSets xattr values.
mtr set -s id=123 path1.txt
: set xattr id
to value 123
on path1.txtmtr set -s id=123 -s url=http://example.com path1.txt path2.txt path3.txt
: set xattr id
to value 123
and xattr url
to value http://example.com
on path1.txt, path2.txt, and path3.txtGet and print xattr values for one or more paths.
By default, the get
subcommand outputs a tab-separated table with a column order of path
, field
, value
. The value bytes are written to stdout as-is without decoding.
By contrast, when outputting JSON, Mattress attempts to decode values as UTF-8, filling in a default codepoint when the decoding fails.
mtr get path1.txt
: print all xattrs associated with path1.txt as raw (undecoded) TSVmtr get -f id path1.txt
: print xattr id
and its value on path1.txt as raw (undecoded) TSVmtr get -f id -f url path1.txt path2.txt path3.txt
: print xattrs id
and url
and their respective values on path1.txt, path2.txt, and path3.txt as raw (undecoded) TSVThe get
command can also output JSON:
mtr get -j path1.txt
: print all xattrs associated with path1.txt as UTF-8 decoded JSONmtr get -j -f id path1.txt
: print xattr id
and its value on path1.txt as UTF-8 decoded JSONmtr get -j -f id -f url path1.txt path2.txt path3.txt
: print xattrs id
and url
and their respective values on path1.txt, path2.txt, and path3.txt as JSONTODO Recursive get
that benefits from "table" structure / indexing.
Indexes a "table".
When Mattress acts on a directory as if it were a database table, each file acts as a relational "record" with the primary key coming from the subpath under the table directory.
Each file's extended attributes act as the relational attributes, with an overloadable virtual attribute id
that represents the primary key.
For each subcomponent $i of the primary key, there is also a virtual attribute id$i
.
Table directories created by Mattress also contain a special xattr user.mattress.keyname
which gives a user-friendly name for the primary key
component represented by that directory.
Examples:
mtr idx -k name ./people ./people-by-name
: recursively reindex the contents of ./people
into a new directory ./people-by-name
with primary key
coming from xattr name
and files hardlinked to the corresponding files in ./people
.
That means the ./people-by-name
directory's files will have filenames taken from the names of the people as defined in xattr name
.
The new directory ./people-by-name
will have xattr user.mattress.keyname=name
so later commands can do efficient index lookups using
user-friendly field names.
mtr idx -k region -k name -s ./people-by-name ./people-by-region-and-name
: recursively reindex the contents of ./people-by-name
into a new directory
./people-by-region-and-name
with primary key being the compound of xattr region
and xattr name
(in that order) and files hardlinked to the
corresponding files in ./people
, resolved via the hardlinks in ./people-by-name
.
The output directory ./people-by-region-and-name
will have xattr user.mattress.keyname=region
and each region-named subdirectory will have
xattr user.mattress.keyname=name
.