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.
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/@
$ ls ~/myfiles/store/startrek/+/starwars/@
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/@
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/@/
$ 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.