Fselect: Find files with SQL-like queries
github.com
github.com
Honestly I'd love to see SQL (or something like it) become a first-class citizen in operating systems generally -- as a standard way for manipulating files, logs, preference files, etc.
To be clear: not turning things into databases (keep logs as logs), but make everything interpretable to SQL.
It's bizarre to me that in just a few lines I can achieve magic with a database... but I can't trivially do the same magic with my filesystem.
Just like a shell is an integral part of an OS... shouldn't a query language be too? I'd love it if, out-of-the-box, Linux distributions came with a standardized SQL+JSON-over-the-filesystem approach that functioned as a small-scale working database for any tool that wanted to use it as such.
But for me the idea of writing (CREATE, UPDATE, DELETE) would be an integral part of it as well -- whether inserting a property into a JSON file, adding a cronjob as column parameters rather than a text line, or creating files.
Red hatters maintained it (hung out in irc) until cloud container workflows surpassed in-place system administration. It pairs nicely with puppet, and can be used manually.
Something that at least gets halfway is 'Everything' since it indexes files extremely quickly, sorts on multiple attributes extremely quickly, and allows regular expressions. It would be better if these things were built into the OS so that tools could be built on top of them.
Having some cli tools that focussed on this would be relatively easy to implement, and you could even create a special GUI based tool.
What do you have in mind when it comes to it being a “first class citizen” of the OS?
https://docs.microsoft.com/en-us/windows/win32/wmisdk/queryi...
c : a + b
select col from my_table where other_col > c
So no more faffing around with manually building queries, and queries are ran by the same process that has access to all your variables.My thoughts before reading the README.md: SQL is nice and all but seems verbose and awkward compared to just using find.
My thoughts after reading the README.md: Wow, this tool can query on file format-specific metadata such as ID3 tags in mp3 files and even width/height in pictures. This is really neat. There is a lot of possibility here.
Aside from Haiku, does anyone know if any of the open-source Unix-like operating systems support arbitrary extended file attributes?
[1] https://en.wikipedia.org/wiki/Extended_file_attributes#Linux
All e-mail were separate eml files, with attributes for most of the important data.
Same for contacts.
In BeOS everything was more a file than in most *nix
https://arstechnica.com/information-technology/2018/07/the-b...
The metadata store of OrangeFS (PVFS2) is implemented with a database, though a key-value one, and one of the project ideas for it is to search that directly.
``` Japanese string:
CONTAINS_JAPANESE Used to check if string value contains Japanese symbols
CONTAINS_KANA Used to check if string value contains kana symbols
CONTAINS_HIRAGANA Used to check if string value contains hiragana symbols
CONTAINS_KATAKANA Used to check if string value contains katakana symbols
CONTAINS_KANJI Used to check if string value contains kanji symbols
```For the unaware, BeFS combines the attributes of a hierarchical filesystem and (some of) a relational database. It could do interesting things like store contacts as a zero-contents file which had key-value pairs for things like names and email addresses.
There are some open-source reimplementations of it, thanks to the Haiku project; I wonder if they've ever been integrated with the Linux kernel and distros.
Trying again was a substantial reason for the delay of one of the more recent versions. Vista perhaps?
~= | =~ | regexp | rx Used to check if the column value matches the regex pattern
!=~ | !~= | notrx Used to check if the column value doesn't match the regex pattern find $PATH -regex $FILENAME_REGEX -exec grep $CONTENT_REGEX
grep -r [-E] $CONTENT_REGEX --include $FILEGLOB
Your bonus case: find $PATH -regex $FILENAME_REGEX \
-exec sh -c "grep [-E] -$NUMBER_OF_CONTEXT_LINES $CONTENT_REGEX1 | grep -l [-E] $CONTENT_REGEX2"
The "[-E]" here is just to mention the command switch if you want to use extended regex.Looks like osquery can also be used for file searching, but it's not as optimized for command-line usage.
https://blog.kolide.com/the-file-table-in-osquery-is-amazing...
1) dump filesystem (or some other data schema generation) metadata into sqllite 2) pass query to sqllite 3) pass sqllite response to stdout
and it would still be faster than the adhoc query engines like this.
On Windows for example there is Everything search engine which scans NTFS table and installs filter driver. Its instant on any disk size. If it were keeping its database in sqlite, we would have exactly what AtlasBarfed suggested.
sqlite> .headers on
sqlite> .mode column
sqlite> SELECT name,mode,mtime FROM fsdir("/usr") where name like '%.h' LIMIT 3;
name mode mtime
------------------------ ---------- ----------
/usr/include/_G_config.h 33188 1607359089
/usr/include/aio.h 33188 1607359089
/usr/include/aliases.h 33188 1607359089
It's not nearly as full featured as this Fselect tool, though. I'm somewhat surprised nobody has cloned or updated the extension and added more stat() fields or things like extended file attributes. It doesn't even have the file size.There is a nice CPAN module called File::Find::Rule which has similar functionality, but you need to write some code, of course.