- Notifications
You must be signed in to change notification settings - Fork88
Find files with SQL-like queries
License
Apache-2.0, MIT licenses found
Licenses found
jhspetersson/fselect
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Find files with SQL-like queries
While it doesn't tend to fully replace traditionalfind
andls
,fselect has these nice features:
- SQL-like (not real SQL, but highly relaxed!) grammar easily understandable by humans
- complex queries
- aggregate, statistics, date, and other functions
- search within archives
.gitignore
,.hgignore
, and.dockerignore
support (experimental)- search by width and height of images, EXIF metadata
- search by MP3 info
- search by extended file attributes and Linux capabilities
- search by file hashes
- search by MIME type
- shortcuts to common file types
- interactive mode
- various output formatting (CSV, JSON, and others)
More is under way!
- InstallRust with Cargo and its dependencies to build a binary
- Run
cargo install fselect
AUR package, thanks to@asm0dey
AUR bin package, thanks to@4censord
fselect
innixpkgs
, thanks to@filalex77
A statically precompiledbinary is available at GitHub downloads.
- Installwinget
- Run
winget install -e --id fselect.fselect
- InstallChocolatey
- Run
choco install fselect
- InstallScoop
- Run
scoop install fselect
- Installbrew
- Run
brew install fselect
- InstallMacPorts
- Run:
sudo port selfupdatesudo port install fselect
fselect [ARGS] COLUMN[, COLUMN...] [from ROOT[, ROOT...]] [where EXPR] [group by COLUMNS] [order by COLUMNS] [limit N] [into FORMAT]
fselect -i
More detailed description. Look at examples first.
Find temporary or config files (full path and size):
fselect size, path from /home/user where name = '*.cfg' or name = '*.tmp'
Windows users may omit the quotes:
fselect size, path from C:\Users\user where name = *.cfg or name = *.tmp
Or put all the arguments into the quotes like this:
fselect "name from /home/user/tmp where size > 0"
Search within a directory name with spaces (backticks are also supported):
fselect "name from '/home/user/dir with spaces' where size > 0"fselect "name from `/home/user/dir with spaces` where size > 0"
Or simply escape the single quotes:
fselect name from \'/home/user/dir with spaces\' where size gt 0
Specify file size, get absolute path, and add it to the results:
cd /home/userfselect size, abspath from ./tmp where size gt 2gfselect fsize, abspath from ./tmp where size = 5mfselect hsize, abspath from ./tmp where size lt 8kfselect name, size from ./tmp where size between 5mb and 6mb
More complex query:
fselect "name from /tmp where (name = *.tmp and size = 0) or (name = *.cfg and size > 1000000)"
Aggregate functions (you can use curly braces if you want, and even combine them with the regular parentheses):
fselect "MIN(size), MAX{size}, AVG(size), SUM{size}, COUNT(*) from /home/user/Downloads"
Formatting functions:
fselect "LOWER(name), UPPER(name), LENGTH(name), YEAR(modified) from /home/user/Downloads"
Get the year of the oldest file:
fselect "MIN(YEAR(modified)) from /home/user"
Use single quotes if you need to address files with spaces:
fselect "path from '/home/user/Misc stuff' where name != 'Some file'"
Regular expressions ofRust flavor are supported:
fselect name from /home/user where path =~ '.*Rust.*'
Negate regular expressions:
fselect "name from . where path !=~ '^\./config'"
Simple globs expand automatically and work with=
and!=
operators:
fselect name from /home/user where path = '*Rust*'
Classic LIKE:
fselect "path from /home/user where name like '%report-2018-__-__???'"
Exact match operators to search with regexps disabled:
fselect "path from /home/user where name === 'some_*_weird_*_name'"
Find files by date:
fselect path from /home/user where created = 2017-05-01fselect path from /home/user where modified = todayfselect path from /home/user where accessed = yesterdayfselect "path from /home/user where modified = 'apr 1'"fselect "path from /home/user where modified = 'last fri'"
Be more specific to match all files created at interval between 3PM and 4PM:
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 minimum and/or maximum depth specified (depth
is a synonym formaxdepth
):
fselect path from /home/user/oldstuff depth 5 where name = '*.jpg'fselect path from /home/user/oldstuff mindepth 2 maxdepth 5, /home/user/newstuff depth 10 where name = '*.jpg'
Optionally follow symlinks:
fselect path, size from /home/user symlinks 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 size, path from /home/user depth 5 archives symlinks where name = '*.jpg' limit 100
Enable.gitignore
or.hgignore
support:
fselect size, path from /home/user/projects gitignore where name = '*.cpp'fselect size, path from /home/user/projects git where name = '*.cpp' fselect size, path from /home/user/projects hgignore where name = '*.py'
Search by image dimensions:
fselect CONCAT(width, 'x', height), path from /home/user/photos where width gte 2000 or height gte 2000
Find square images:
fselect path from /home/user/Photos where width = height
Find images with a known name part but unknown extension:
fselect path from /home/user/projects where name = "*RDS*" and width gte 1
Find old-school rap MP3 files:
fselect duration, path from /home/user/music where genre = Rap and bitrate = 320 and mp3_year lt 2000
Shortcuts to common file extensions:
fselect path from /home/user where is_archive = truefselect path, mime from /home/user where is_audio = 1fselect path, mime from /home/user where is_book != false
Even simpler way of using boolean columns:
fselect path from /home/user where is_docfselect path from /home/user where is_imagefselect path from /home/user where is_video
Find files with dangerous permissions:
fselect mode, path from /home/user where other_write or other_execfselect mode, path from /home/user where other_all
Simple glob-like expressions or even regular expressions on file mode are possible:
fselect mode, path from /home/user where mode = '*rwx'fselect mode, path from /home/user where mode =~ '.*rwx$'
Find files by owner's uid or gid:
fselect uid, gid, path from /home/user where uid != 1000 or gid != 1000
Or by owner's or group's name:
fselect user, group, path from /home/user where user = mike or group = mike
Find special files:
fselect name from /usr/bin where suidfselect path from /tmp where is_pipefselect path from /tmp where is_socket
Find files with xattrs, check if particular xattr exists, or get its value:
fselect "path, has_xattrs, has_xattr(user.test), xattr(user.test) from /home/user"
Include arbitrary text as columns:
fselect "name, ' has size of ', size, ' bytes'"
Group results:
fselect "ext, count(*) from /tmp group by ext"
Order results:
fselect path from /tmp order by size desc, namefselect modified, fsize, path from ~ order by 1 desc, 3
Finally limit the results:
fselect name from /home/user/samples limit 5
Format output:
fselect size, path from /home/user limit 5 into jsonfselect size, path from /home/user limit 5 into csvfselect size, path from /home/user limit 5 into html
MIT/Apache-2.0
Supported byJetBrains IDEA open source license
About
Find files with SQL-like queries