Find files with SQL-like queries
While it doesn't tend to fully replace traditional find and ls, fselect has these nice features:
- complex queries
- SQL-like (not real SQL, but highly relaxed!) grammar easily understandable by humans
- search within archives
- search by width and height of images
- shortcuts to common file types
More is under way!
- Install Rust with Cargo and its dependencies to build a binary
- Run
cargo install fselect
...or download a statically precompiled binary from Github if you are on a modern Windows 64bit
fselect COLUMN[, COLUMN...] from ROOT[, ROOT...] [where EXPR] [limit N]
Find temporary or config files (full path and size):
fselect path, size from /home/user where name = *.cfg or name = *.tmp
Find files (just names) with any content (size > 0):
fselect name from /home/user/tmp where size gt 0
or put arguments into the quotes:
fselect "name from /home/user/tmp where size > 0"
Specify file size and add it to the results:
fselect path, size from /home/user/tmp where size gt 2g
fselect path, fsize from /home/user/tmp where size = 5m
fselect path, hsize from /home/user/tmp where size lt 8k
More complex query:
fselect name from /tmp where (name = *.tmp and size = 0) or (name = *.cfg and size gt 1000000)
Use single quotes if you need to address files with spaces:
fselect path from '/home/user/Misc stuff' where name != 'Some file'
Regular expressions supported:
fselect name from /home/user where path ~= .*Rust.*
And even simple glob will suffice:
fselect name from /home/user where path = *Rust*
Exact match operators to search with regexps disabled:
fselect path from /home/user where name === 'some_*_weird_*_name'
Find files by creation date:
fselect path from /home/user where created = 2017-05-01
Be more specific to match all files created at 3PM:
fselect path from /home/user where created = '2017-05-01 15'
And even more specific:
fselect path from /home/user where created = '2017-05-01 15:10'
fselect path from /home/user where created = '2017-05-01 15:10:30'
Date and time intervals possible (find everything updated since May 1st):
fselect path from /home/user where modified gte 2017-05-01
Default is current directory:
fselect path, size where name = *.jpg
Search within multiple locations:
fselect path from /home/user/oldstuff, /home/user/newstuff where name = *.jpg
With maximum depth specified:
fselect path from /home/user/oldstuff depth 5 where name = *.jpg
fselect path from /home/user/oldstuff depth 5, /home/user/newstuff depth 10 where name = *.jpg
Search within archives (currently only zip-archives are supported):
fselect path, size from /home/user archives where name = *.jpg
Or in combination:
fselect path, size from /home/user depth 5 archives where name = *.jpg limit 100
Search by image dimensions:
fselect path, width, height from /home/user/photos where width gte 2000 or height gte 2000
Shortcuts to common file extensions:
fselect path from /home/user where is_archive = true
fselect path from /home/user where is_audio = 1
fselect path from /home/user where is_doc != 1
fselect path from /home/user where is_image = false
fselect path from /home/user where is_video != true
Find files with dangerous permissions:
fselect path, mode from /home/user where other_write = true or other_exec = true
Simple glob-like expressions or even regular expressions on file mode are possible:
fselect path, mode from /home/user where mode = *rwx
fselect path, mode from /home/user where mode ~= .*rwx$
Find files by owner's uid or gid:
fselect path, uid, gid from /home/user where uid != 1000 or gid != 1000
Or by owner's or group's name:
fselect path, user, group from /home/user where user = mike or group = mike
Finally limit the results:
fselect name from /home/user/samples limit 5
pathnamesizehsizeorfsizeuidgidusergroupcreatedaccessedmodifiedis_diris_filemodeuser_readuser_writeuser_execgroup_readgroup_writegroup_execother_readother_writeother_execwidthheightis_archiveis_audiois_docis_imageis_video
=or==oreq!=or<>orne===!==>orgt>=orgteorge<orlt<=orlteorle~=orregexporrx
gorgbfor gibibytesmormbfor mibibyteskorkbfor kibibytes
- is_archive:
.7z,.bzip2,.gz,.gzip,.rar,.tar,.xz,.zip - is_audio:
.aac,.aiff,.amr,.flac,.gsm,.m4a,.m4b,.m4p,.mp3,.ogg,.wav,.wma - is_doc:
.accdb,.doc,.docx,.dot,.dotx,.mdb,.ods,.odt,.pdf,.ppt,.pptx,.rtf,.xls,.xlt,.xlsx,.xps - is_image:
.bmp,.gif,.jpeg,.jpg,.png,.tiff,.webp - is_video:
.3gp,.avi,.flv,.m4p,.m4v,.mkv,.mov,.mp4,.mpeg,.mpg,.webm,.wmv
MIT/Apache-2.0