Re: Can GNU-find command search by xattrs?
"Peter B." <[email protected]> Sun, 11 Jan 2026 01:00:44 +0100
| Newsgroups | gmane.comp.gnu.findutils.bugs |
|---|---|
| Message-ID | <[email protected]> |
On 1/7/26 01:24, raf wrote: > On Sat, Jan 03, 2026 at 10:05:16PM +0100, "Peter B." <[email protected]> wrote: > >> Hi! >> >> I'm super happy to see that I'm not the only one anymore interested in >> increased xattr, and therefore possible key/value usage and query >> functionality! >> >> 😀️ >> >> **I'm writing this with personal interest** >> Yes, we ALL have data to deal with, and I like to tag and find my kids' >> photos and files - regardless which "app" or system- >> >> **as well as my professional interest** >> Working with small-to-medium-to-very-very-large digital heritage >> collections. >> >> (And therefore loads of meta+data wrangling clever-hacks-and-stunts for a >> living 😉️) >> >> >> So, my hopefully useful "few-cents" to this thread are here: >> >> On 1/2/26 13:11, raf wrote: >>> On Wed, Dec 31, 2025 at 04:21:14PM +0100, Bernhard Voelker <[email protected]> wrote: >>> >>>> On 12/30/25 17:45, Peter B. wrote: >>>>> I'll also checkout Morgan's find-patch: >>>>> I'd really love to see xattr-support in the basic "most likely to be >>>>> present-on-any-box" tools. >>>> The technical coding under the hood for reading xattr from the file system >>>> is there in Morgan's patch for quite a while, indeed. >>>> >>>> But before adding, I feel we need to discuss once again the interface >>>> to the find(1) user: >>>> >>>> - Do we only want to provide an option to search for files having xattrs? >>>> find -xattr >>>> >>>> - Do we want a test option to search for a file having an xattr key matching >>>> a certain string (or eventually pattern)? >>>> find -xattr 'mykey' # xattr key equals string >>>> find -xattr '*mykey*' # xattr key matches pattern >>>> Or better explicitly mention in the option that we match for the xattr keys? >>>> find -xattr-key 'mykey' >>>> find -xattr-key '*mykey*' >>>> >>>> - Do we want a test option to search for a file having an xattr value matching >>>> a certain string (or eventually pattern)? >>>> find -xattr-value 'myval' # files with xattr value equals string >>>> find -xattr-value '*myval*' # ... or pattern >>>> >>>> - Or search for files with xattr having a certain mixture of 'key=val'? >>>> find -xattr-match 'mykey=myval' # search by key+val as strings >>>> find -xattr-match 'mykey=*someval*' # search for key matching a val pattern >>> There are versions of find that (I think) use -xattr to >>> just identify the existence of EAs. I don't think >>> that's enough, but it might make sense to have -xattr >>> do that >> +1 >> absolutely agree. >> To both: useful and not-enough. >> >> >>> (for compatibility with those other versions of >>> find), but to also have -xattr-key and -xattr-value (or >>> -xattr-match for both). >> +1 again. >> It indeed makes perfect sense (and has use-cases!) where one wants to query >> (key OR value) AND (key AND value). >> >> A lot useful if that provides some RegEx (for matching wildcards/patterns). >> >> >>> The thing to watch out for if both the key and value >>> are combined, is that if you format it like "key=value" >>> you need to consider the case where the key includes >>> "=". There might be malicious EAs trying to be tricky. >> True. >> There will always be potential for malicious attempts, yet I would suggest >> to apply basic "query-escaping", until more strict antitrust seems >> necessary? >> >> >>> My rawhide program matches EAs formatted like "key: >>> value" but non-ascii bytes are encoded (like \x1b or \n >>> or \t etc.) and any ": " in the key itself is encoded >>> as "\x3a " to disappoint the creators of malicious EAs. >>> I've never seen an EA whose key contained ": " so I >>> don't think it'll bother anyone. >> I think we're on the same page here :) >> Yet, one may say "xattrs are not-yet-popular enough, but you'll see, once >> they do..." - like with all formats and data-exchange protocols, I guess? > EAs/xattrs are used for various things by various > systems. (e.g. selinux on Linux, quarantine on macOS) > but user/app-specific usage probably isn't popular yet. > Although it can be. Some systems allow 64KiB of EA data. Thanks for info! I can confirm that. btw, app-specific usage: yt-dlp supports `--xattrs` 😉️ I've put some FAQ infos together regarding xattrs (in 2024/25): https://github.com/ArkThis/AHAlodeck/blob/main/doc/xattr_faq.md The FAQ also contains xattr size-constraints per filesystem I was able to find (or test it). ZFS can do 64kiB, indeed: I must admit I still want to test if PER "key and/or value" - or in total. I've done tests, attaching a ~45kB uuencoded JPG image as xattr on ZFS and back: MD5 match. I love the fact that EAs are used for security purposes: I can assume it means relying on them is enterprise-production-stable (at least regarding the kernel/filesystem side)? > > What if: > > - I search for "some term", but don't care if it's a key or value string? > Having -xattr-key and -attr-value wouldn't help you in > that case. If you didn't care if it's a key or a value, > then you'd need to use both predicates in your search > (-xattr-key ... -o -xattr-value ...). > > But the problem I was thinking of was that, if these > two predicates existed, then a user might reasonably > expect them to be connected to each such that using > both of them would refer to the same extended > attribute, i.e. that -xattr-key ... -a -xaatr-value ... > would match a file with an EA whose key matched the > -xattr-key and whose value matched the -xattr-value. > But it would almost certainly match a file with an EA > with the matching key and an EA with the matching > value, but they wouldn't have to be the same EA. They > could be different EAs. So I think it would be > difficult for a user to guess the correct behaviour. I was thinking of defaulting to "linked" (=like `keep aspect ratio` by default), and options to declare if my intention is linked/unlinked? >> I have that use-case a lot: plain fulltext search in collections. > That use case is best served (I think) by a single > predicate that can match both the key and value encoded > in some way as I described earlier (either by > "key=val\n" or "key: val\n"). I chose ": " because > that's the format output by xattr on macOS (and > probably elsewhere). Hm. Does that mean you're matching against the output of `xattr` for searching, or just that you'd like to stay pattern-compatible with it? > That way, if you don't care whether your search > criteria applies to the key or the value, you can just > do -xattr-match 'something' and if you want to match a > key only you can do -regexxattr-match '^somekey: ' and > if you want to match a value only you can do > -regexxattr-match '^[^\n]+: [^\n]*someval', and to > match both the key and the value, you can do something > like -regexxattr-match '^somekey: [^\n]*someval'. Roger that. Is there any overhead due to requiring regex for this, compared to non-pattern matching here? > The above assumes that all EAs are encoded as a single > piece of text with one line per EA that is matched > against. The choice of encoding and whether it's > encoded like this at all would affect the examples. > This sort of matching probably isn't possible with > globbing unless the ksh extensions are available. > >>> I'd vote for just -xattr and -regexxattr (and maybe >>> -ixattr and -iregexxattr) and have it match text that >>> looks like "key1=val1\nkey2=val2\nkey3=val3\n" or >>> "key1: val1\nkey2: val2\nkey3: val3\n". >> I like args names that explain what they are, but just for "style" >> suggestion: >> >> [quick bike-shedding]: >> What if, you'd call it "--xattr" and "--xxattr" or "--xattRX/xattrx"? (like >> the "RX" at the end is "RegEx" :P) >> >> Just an idea... > I suggested names that I thought were like the existing predicate names. > I don't know what would be best. Sorry, didn't know there were existing ones: Then of course it makes sense to keep their names. > >> And I assume "ixattr" is "case Insensitive"? > That's right. > >>>> - Do we need support for -printf formats to print xattr keys and/or values? >>>> How? The % 1-character directives are almost all used, maybe begin with >>>> the reserved ones? (%{ %[ %( >>>> How to output several xattr keys or values? >>>> How to select which xattr value to print? >>>> find -xattr -printf '%p %{xattr-keys=hello*} %{xattr-valuekey=hello} >>> There are plenty of conversion letters available! >>> >>> See https://savannah.gnu.org/bugs/?64100 >> Having quickly read over that thread, I totally agree "IF those features be >> added, IF possible, it'd be great if rawhide and find could stay >> syntax-compatible". >> >> Also, I think (If I understood correctly) that some common-library-printf >> formatting syntax may save A LOT of re-occurring bash-or-python-style >> "formatting-caller-works-on-my-machine" scripts, I guess? >> But I'm far out on a limb here; I've not really read the thread, and I've >> never used find-output formatting (as I didn't know it had any). > Only GNU find has it. > >>>> There's a lot of possibilities, and I don't want to introduce something >>>> which contradicts the typical use cases, or is not extensible or not >>>> maintainable. >>>> The complexity - especially when it comes to -printf - is that files can have >>>> several xattr while all other attributes (name, timestamps, permissions, size, >>>> etc.) only exists once. >>> My rawhide program also has %j for JSON output. The >>> current version outputs EAs like %x but the next >>> version outputs them as a JSON object with key/value >>> pairs matching the EA names and values. It's still >>> encoded because EA values can be text or binary and >>> JSON can't represent binary without the user choosing >>> some encoding. So that's something to think about. >> If any output data is available in a machine readable format (like JSON), >> it'd definitely make the re-usability and interoperability between tools >> (and scripts) written around find/rawhide, IMO (and experience). >> >>>> I think I asked this kind of questions already some years ago, but there was >>>> no input yet. >>>> I personally don't have a use case to search for xattrs, so the usual pattern >>>> with '-exec getfattr ...' works for me. >>>> Anyone? >> ME! Meee! :) >> As I said, I'm doing devops for digital-and-physical GLAM-collections - and >> a lot of metadata layout, storage and retrieval/usage. >> >> For example: >> After de-embedding (=copying as-is) all exiftool-readable metadata into >> xattrs, being able to do some queries on those key/value pairs is AMAZING! >> >> Combining that with RDF URIs for keys, combined with Wikibase-and-Wikidata >> engine and data, I have many great use cases for xattrs (and find). > That sounds cool. A much more interesting use for EAs than > just selinux or quarantining. :-) :) I really like the fact that once I can rely more on xattrs use, **any file-format ever is basically irrelevant from now on, for "all things metadata"**. And this feels really good! Like: Why must I choose another file-format, if I simply want to give "my file/data" annotation information? (BMP vs PNG vs TIFF vs ... ".txt" regarding storing "their title"?) Friend of mine has written a small "updatedb/locate" version with xattr-only support a few days ago for testing: He ran it on a collection of mixed-format, real-world annotated music collection (~14.000 files) - which have all exiftool metadata as xattrs: 13917 files took 1.416 seconds to index. The index.db entries is a simple CSV, with: `"filename", "xattr-key", "xattr-value"` Using xattrs already feel more streamlined, consistent and stable than any MAM/DAM metadata handling paradigm I've seen so far... ;) I've rediscovered xattrs btw, when evaluating object storage implementations (FOSS) for large-scale data handling: When I found out that S3 has very limited size for tags (127/256 chars) and other limitations (<=4kB) for metadata, or ASCII-only in popular implementations. See: [Minio issue #19576: "non ASCII characters in metadata"](https://github.com/minio/minio/discussions/19576) ...and pre-S3 Object Storages use the underlying filesystem's xattrs for their object-metadata! ;) >>>> P.S. Finally, I wouldn't want to introduce too much and complex code for >>>> 0.25% use cases. Eventually, the simple test to search for files having >>>> xattrs is enough, and the application logic then extracts them with another >>>> tool. >> Is this about the code to handle xattrs (in `gnu-find`)? >> There are libs for plain access to xattr key/value, but is there any >> xattr-libs for higher-level functions (like queries, regex, etc)? > I think the actual searching would be done by what find is already doing > (glob, regex). Roger. >> Like what HaikuOS (probably?) does in their BeFS filesystem libraries? >> A friend of mine (author of "https://sen-labs.org/": a semantic desktop >> engine for Haiku) told me that BeFS has some database-like query functions >> built-into their filesystem "xattrs". >> >> I know any additional library-dependence is another "whole thing" to >> maintain. >> However, IMO being able to query key/value data "on the spot" is something >> that will eventually replace the legacy "files-in-folders open/save dialogs >> - and wildcards" as-we-know-it...? >> >> Might be an incentive to invest in a common, and commonly supported >> "attribute-handling" lib. >> Just 2¢ of mine. >> >> I just like interoperable and open tech-systems :) >> >> >>> I don't think it's necessarily too complex. The code in >>> rawhide to obtain EAs is 492 lines (335 excluding >>> blanks line, 278 excluding comment lines as well) for >>> Linux, macOS, Cygwin, Solaris, and FreeBSD (OpenBSD and >>> NetBSD don't have EAs). But of course, that's only the >>> start. >> Including so many OSs already in your consideration(s), wouldn't that >> already suffice for a common lib? >> Ignore and correct me, if I'm totally on the wrong track here? >> Thanks :) > rawhide is GPLv3+ so the code is available for a > library but if potential clients don't like my choices > for encoding the EA data it might not be suitable for > their needs. Encoding is always tricky to get right, > and maybe I didn't. And it's probably unwise to use a > third-party library until it has become popular enough > to be packaged on lots of systems. And GNU find > supports many more systems than rawhide does, and I > don't know which other systems support EAs. I only > support systems that I have real or virtual machines > for. Thanks for those interesting insights! Indeed, good point: no lib-dependency until "popular enough". Kind regards, Peter