The best way seems to be the tagging file system tagsistant.
From the homepage:
Tagsistant is a tag-based filesystem for Linux that turns directories
into tags and search your files for you.
Mount Tagsistant
Just tell Tagsistant the name of the directory you want to use, for
example myfiles/ in your home. This directory is now a special place
with custom rules that help you manage your files.
$ tagsistant ~/myfiles
$
Create your tags
Think to directories under tags/ as white stickers you write something
on top of. Create as many tags as you need, ready to mark your files.
$ mkdir ~/myfiles/tags/startrek
$ mkdir ~/myfiles/tags/starwars
$ mkdir ~/myfiles/tags/scifi
Tag your files
After creating a tag in tags/, it will be available in store/. Copy
your files inside it: that's how you tag files. The @ marks the end of
the tag list and it's required.
$ cp first_contact.avi ~/myfiles/store/startrek/@
$ cp the_return_of_the_jedi.avi ~/myfiles/store/starwars/@
Find your files by tags
Compose your search query by choosing as many tags you desire. You can
even combine the results of more than one query by placing a +/ in
between, like in startrek/+/starwars/ which merges the files tagged
startrek with the files tagged starwars.
$ ls ~/myfiles/store/startrek/@
first_contact.avi
$ ls ~/myfiles/store/startrek/+/starwars/@
first_contact.avi
the_return_of_the_jedi.avi
Activate relations between tags
$ mkdir ~/myfiles/relations/scifi/includes/startrek
$ ls ~/myfiles/store/scifi/@
first_contact.avi # 1 file...
$ mkdir ~/myfiles/relations/scifi/includes/starwars
$ ls ~/myfiles/store/scifi/@
first_contact.avi
the_return_of_the_jedi.avi # 2 files!
Tagsistant understands several relations:
- includes: If A includes B, any file tagged as B can be automatically found inside A.
- excludes: If A excludes B, any file tagged as B can't be found inside A even if it's tagged as A.
- is_equivalent: If A is equivalent to B, then all the files in A are available in B and vice versa.
And there's even more!
Tag entire directories
$ cp -R ~/Photos/London ~/myfiles/store/photos/@
$ ls -l ~/myfiles/store/photos/@/
London
$ ls -l ~/myfiles/store/photos/@/London/
-rw------- 1 tx0 tx0 2.3M Sep 28 2009 bridge.jpg
-rw------- 1 tx0 tx0 3.0M Aug 30 2011 trafalgar_square.jpg
[ ... more files here ... ]
With Tagsistant you can tag entire directories. The directory itself
will be tagged, not the files inside, saving space in the tag db.
Use triple tags
$ ls ~/myfiles/store/document:/author/eq/Tx0/@
$ ls ~/myfiles/store/document:/title/inc/Strategic/@
$ ls ~/myfiles/store/pictures:/aperture/gt/5.6/@
$ ls ~/myfiles/store/time:/hour/lt/3/@
Triple tags are advanced tags formed by a namespace (terminated by a
colon) which identifies the domain of interest of the tag, a key which
qualifies the tag, an operator (eq for equality, gt for greater than,
lt for less than and inc for includes), and finally a value which
quantifies the tag.
This seems to me the most consistent and elegant approach for file tagging on Linux. It's around for more than 10 years, so it's a mature solution as well, without the risk of disappearing soon.