1190 lines
25 KiB
Groff
1190 lines
25 KiB
Groff
.TH FSELECT 1
|
|
.SH NAME
|
|
fselect \- find files with SQL-like queries
|
|
.SH SYNOPSIS
|
|
.B fselect
|
|
.RB [ \-\-nocolor ]
|
|
.RB [ \-\-no\-errors ]
|
|
.RB [ \-\-us\-dates ]
|
|
.RB [ \-\-config
|
|
.IR FILE ]
|
|
.PP
|
|
.B fselect
|
|
.I COLUMN
|
|
.RI [ ", " COLUMN " ..."]
|
|
.RB [ from
|
|
.IR ROOT
|
|
.RI [ ", " ROOT " ..."]]
|
|
.RB [ where
|
|
.IR EXPR ]
|
|
.RB [ group
|
|
.B by
|
|
.IR COLUMNS ]
|
|
.RB [ order
|
|
.B by
|
|
.IR COLUMNS ]
|
|
.RB [ limit
|
|
.IR N ]
|
|
.RB [ offset
|
|
.IR N ]
|
|
.RB [ into
|
|
.IR FORMAT ]
|
|
.PP
|
|
.B fselect \-i
|
|
.SH DESCRIPTION
|
|
.B fselect
|
|
is a command-line utility for finding files using an SQL-like query language.
|
|
The
|
|
.B fselect
|
|
command itself acts as the
|
|
.B select
|
|
keyword (i.e.,
|
|
.IR "file select" ).
|
|
An optional
|
|
.B select
|
|
keyword at the beginning of the query is accepted but not required.
|
|
.PP
|
|
Query columns may be file attributes, arbitrary string literals (quoted if they contain spaces),
|
|
function calls, or arithmetic expressions.
|
|
.PP
|
|
If
|
|
.B from
|
|
is omitted, the current directory is searched.
|
|
Multiple search roots may be listed, separated by commas.
|
|
Each root may have its own set of options (depth, symlinks, archives, etc.).
|
|
.PP
|
|
Queries containing
|
|
.BR > ,
|
|
.BR < ,
|
|
parentheses, or shell metacharacters such as
|
|
.BR * " and " ?
|
|
should be enclosed in double quotes to prevent shell interpretation.
|
|
.PP
|
|
Commas between column names are optional.
|
|
String literals do not need quotes unless they contain spaces or shell metacharacters.
|
|
Functions with no arguments do not require parentheses.
|
|
Curly braces may be used instead of parentheses.
|
|
.SH OPTIONS
|
|
.TP
|
|
.BR \-\-interactive ", " \-i
|
|
Run in interactive mode.
|
|
.TP
|
|
.BI \-\-config " FILE"
|
|
Specify an alternative configuration file location.
|
|
.TP
|
|
.BR \-\-nocolor ", " \-\-no\-color
|
|
Disable colorized output.
|
|
.TP
|
|
.B \-\-no\-errors
|
|
Suppress error messages.
|
|
.TP
|
|
.BR \-\-us\-dates
|
|
Interpret ambiguous dates in US format (MM/DD) instead of the default UK format (DD/MM).
|
|
.TP
|
|
.BR \-\-help ", " \-h
|
|
Show help and exit.
|
|
.SH COLUMNS AND FIELDS
|
|
.SS File naming
|
|
.TP
|
|
.B name
|
|
File name with extension.
|
|
.TP
|
|
.BR filename " or " fname
|
|
File name without extension.
|
|
.TP
|
|
.BR extension " or " ext
|
|
File extension only (without the leading dot).
|
|
.TP
|
|
.B path
|
|
Path relative to the search root.
|
|
.TP
|
|
.B abspath
|
|
Absolute path of the file.
|
|
.TP
|
|
.BR directory " or " dirname " or " dir
|
|
Directory portion of the path, relative to the search root.
|
|
.TP
|
|
.B absdir
|
|
Absolute directory portion of the path.
|
|
.TP
|
|
.BR link_target " or " symlink_target
|
|
Target path of the symlink, or empty if the file is not a symlink.
|
|
.SS File naming terminology
|
|
Given a search root of
|
|
.B /home/user/projects
|
|
and a file at
|
|
.BR /home/user/projects/foobar/content/readme.md :
|
|
.PP
|
|
.RS
|
|
.nf
|
|
\fBabspath\fR /home/user/projects/foobar/content/readme.md
|
|
\fBabsdir\fR /home/user/projects/foobar/content
|
|
\fBpath\fR foobar/content/readme.md
|
|
\fBdir\fR foobar/content
|
|
\fBname\fR readme.md
|
|
\fBfilename\fR readme
|
|
\fBext\fR md
|
|
.fi
|
|
.RE
|
|
.SS Size
|
|
.TP
|
|
.B size
|
|
Size of the file in bytes.
|
|
.TP
|
|
.BR fsize " or " hsize
|
|
Human-readable size with unit suffix.
|
|
.SS Timestamps
|
|
.TP
|
|
.B accessed
|
|
Time the file was last accessed (YYYY-MM-DD HH:MM:SS).
|
|
.TP
|
|
.B created
|
|
File creation time (YYYY-MM-DD HH:MM:SS).
|
|
.TP
|
|
.B modified
|
|
Time the file was last modified (YYYY-MM-DD HH:MM:SS).
|
|
.SS Type tests (boolean)
|
|
.TP
|
|
.B is_dir
|
|
True if path is a directory.
|
|
.TP
|
|
.B is_file
|
|
True if path is a regular file.
|
|
.TP
|
|
.B is_symlink
|
|
True if path is a symbolic link.
|
|
.TP
|
|
.BR is_broken_symlink " or " is_broken_link
|
|
True if path is a symbolic link whose target does not exist.
|
|
.TP
|
|
.BR is_pipe " or " is_fifo
|
|
True if path is a FIFO or named pipe.
|
|
.TP
|
|
.BR is_char " or " is_character
|
|
True if path is a character special file.
|
|
.TP
|
|
.B is_block
|
|
True if path is a block special file.
|
|
.TP
|
|
.B is_socket
|
|
True if path is a socket.
|
|
.TP
|
|
.B is_hidden
|
|
True if file is hidden (starts with a dot on Unix).
|
|
.TP
|
|
.B is_empty
|
|
True if file is empty or directory contains no entries.
|
|
.TP
|
|
.B is_shebang
|
|
True if file begins with a shebang
|
|
.RB ( #! ).
|
|
.TP
|
|
.B is_binary
|
|
True if MIME type detection identifies the file as binary.
|
|
.TP
|
|
.B is_text
|
|
True if MIME type detection identifies the file as text.
|
|
.SS Git
|
|
.TP
|
|
.B is_git_repo
|
|
True if the directory contains a
|
|
.B .git
|
|
subdirectory or file (i.e., is the root of a git repository).
|
|
.TP
|
|
.BR is_git_tracked ", " git_tracked
|
|
True if the file is tracked by git.
|
|
.TP
|
|
.BR is_gitignored ", " is_git_ignored
|
|
True if the file is ignored by git.
|
|
.TP
|
|
.B git_status
|
|
Git status of the file:
|
|
.BR clean ", " modified ", " staged ", " untracked ", " conflicted ", or " ignored .
|
|
.TP
|
|
.B git_branch
|
|
Current branch of the git repository containing the file.
|
|
.TP
|
|
.BR git_last_commit_hash ", " git_commit_hash
|
|
Hash of the last commit that touched the file.
|
|
.TP
|
|
.BR git_last_commit_date ", " git_commit_date
|
|
Date of the last commit that touched the file.
|
|
.TP
|
|
.BR git_last_commit_author ", " git_commit_author
|
|
Author of the last commit that touched the file.
|
|
.SS Permissions
|
|
.TP
|
|
.B mode
|
|
Full permission string, similar to the first column of
|
|
.BR "ls \-la" .
|
|
.TP
|
|
.BR uid " / " gid
|
|
Numeric user ID / group ID of the owner.
|
|
.TP
|
|
.BR user " / " group
|
|
Name of the owner / owner's group.
|
|
Available only on Unix when the
|
|
.B users
|
|
feature is enabled.
|
|
.TP
|
|
.BR user_read ", " user_write ", " user_exec ", " user_all " / " user_rwx
|
|
Per-owner permission bits.
|
|
.TP
|
|
.BR group_read ", " group_write ", " group_exec ", " group_all " / " group_rwx
|
|
Per-group permission bits.
|
|
.TP
|
|
.BR other_read ", " other_write ", " other_exec ", " other_all " / " other_rwx
|
|
Permission bits for other users.
|
|
.TP
|
|
.BR suid " or " is_suid
|
|
SUID bit.
|
|
.TP
|
|
.BR sgid " or " is_sgid
|
|
SGID bit.
|
|
.TP
|
|
.BR is_sticky " or " sticky
|
|
Sticky bit.
|
|
.SS Unix/Linux-specific
|
|
.TP
|
|
.B device
|
|
Device number the file resides on.
|
|
.TP
|
|
.B rdev
|
|
Device ID for special files (character and block devices).
|
|
.TP
|
|
.B inode
|
|
Inode number.
|
|
.TP
|
|
.B blocks
|
|
Number of 512-byte blocks allocated.
|
|
.TP
|
|
.B blksize, block_size
|
|
Preferred block size for filesystem I/O in bytes.
|
|
.TP
|
|
.B hardlinks
|
|
Number of hard links.
|
|
.TP
|
|
.B atime
|
|
Last access time as a Unix timestamp (seconds since epoch).
|
|
.TP
|
|
.B atime_nsec
|
|
Nanosecond component of the last access time.
|
|
.TP
|
|
.B mtime
|
|
Last modification time as a Unix timestamp (seconds since epoch).
|
|
.TP
|
|
.B mtime_nsec
|
|
Nanosecond component of the last modification time.
|
|
.TP
|
|
.B ctime
|
|
Last status change time as a Unix timestamp (seconds since epoch).
|
|
.TP
|
|
.B ctime_nsec
|
|
Nanosecond component of the last status change time.
|
|
.TP
|
|
.B has_xattrs
|
|
True if the file has extended attributes (xattrs).
|
|
.TP
|
|
.B xattr_count
|
|
Number of extended attributes (xattrs) on the file, or alternate data streams on Windows.
|
|
.TP
|
|
.B extattrs
|
|
Extended file attribute flags as reported by
|
|
.BR lsattr (1)
|
|
(single-letter codes).
|
|
.TP
|
|
.B has_extattrs
|
|
True if any
|
|
.B extattrs
|
|
flag is set.
|
|
.TP
|
|
.B acl
|
|
All ACL entries in standard form, comma-separated.
|
|
On Linux, returns POSIX ACL entries in
|
|
.BR getfacl (1)
|
|
format.
|
|
On Windows, returns explicit DACL entries as
|
|
.BR type : trustee : permissions
|
|
(e.g.,
|
|
.BR allow:BUILTIN\eAdministrators:full ).
|
|
Permission labels:
|
|
.BR full ", " modify ", " rx ", " read ", " write ,
|
|
or a hex value for non-standard masks.
|
|
Available only on Linux and Windows.
|
|
.TP
|
|
.B has_acl
|
|
True if the file has POSIX ACL entries beyond standard Unix permissions
|
|
or explicit (non-inherited) Windows DACL entries.
|
|
.TP
|
|
.B default_acl
|
|
All default POSIX ACL entries in standard form, comma-separated.
|
|
Available only on Linux.
|
|
.TP
|
|
.B has_default_acl
|
|
True if the directory has default POSIX ACL entries.
|
|
.TP
|
|
.BR has_capabilities " or " has_caps
|
|
True if the file has Linux capabilities.
|
|
Available only on Linux.
|
|
.TP
|
|
.BR capabilities " or " caps
|
|
Linux capabilities string assigned to the file.
|
|
.SS Media
|
|
.TP
|
|
.BR width " / " height
|
|
Width and height of an image or MP4 video in pixels.
|
|
.TP
|
|
.B duration
|
|
Duration of an audio file in seconds.
|
|
.TP
|
|
.BR mp3_bitrate " or " bitrate
|
|
Audio bitrate in kbps.
|
|
.TP
|
|
.BR mp3_freq " or " freq
|
|
Audio sampling frequency.
|
|
.TP
|
|
.BR mp3_title " or " title
|
|
Track title from audio metadata.
|
|
.TP
|
|
.BR mp3_artist " or " artist
|
|
Artist name from audio metadata.
|
|
.TP
|
|
.BR mp3_album " or " album
|
|
Album name from audio metadata.
|
|
.TP
|
|
.BR mp3_genre " or " genre
|
|
Genre from audio metadata.
|
|
.TP
|
|
.BR mp3_comment " or " comment
|
|
Comment from audio metadata.
|
|
.TP
|
|
.BR mp3_track " or " track
|
|
Track number from audio metadata (e.g. 4 or 4/9).
|
|
.TP
|
|
.BR mp3_disc " or " disc
|
|
Disc number (part of a set) from audio metadata (e.g. 1 or 1/2).
|
|
.TP
|
|
.BR mp3_year " or " audio_year
|
|
Year from audio metadata.
|
|
.SS EXIF metadata
|
|
.TP
|
|
.B exif_datetime
|
|
Date and time recorded in EXIF data.
|
|
.TP
|
|
.BR exif_datetime_original " or " exif_dto
|
|
Original date and time when the photo was taken.
|
|
.TP
|
|
.BR exif_altitude " or " exif_alt
|
|
GPS altitude.
|
|
.TP
|
|
.BR exif_latitude " or " exif_lat
|
|
GPS latitude.
|
|
.TP
|
|
.BR exif_longitude " or " exif_lng " or " exif_lon
|
|
GPS longitude.
|
|
.TP
|
|
.BR exif_make " / " exif_model
|
|
Camera manufacturer and model.
|
|
.TP
|
|
.B exif_software
|
|
Software used to create the image.
|
|
.TP
|
|
.B exif_version
|
|
Version of EXIF metadata.
|
|
.TP
|
|
.BR exif_exposure_time " or " exif_exptime
|
|
Exposure time.
|
|
.TP
|
|
.B exif_aperture
|
|
Aperture value.
|
|
.TP
|
|
.B exif_shutter_speed
|
|
Shutter speed.
|
|
.TP
|
|
.BR exif_f_number " or " exif_f_num
|
|
F-number.
|
|
.TP
|
|
.BR exif_iso_speed " or " exif_iso
|
|
ISO speed (EXIF 2.3 ISOSpeed tag).
|
|
.TP
|
|
.BR exif_sensitivity " or " exif_photo_sensitivity
|
|
Photographic sensitivity (ISO).
|
|
.TP
|
|
.BR exif_focal_length " or " exif_focal_len
|
|
Focal length.
|
|
.TP
|
|
.BR exif_lens_make " / " exif_lens_model
|
|
Lens manufacturer and model.
|
|
.TP
|
|
.BR exif_description " or " exif_desc
|
|
Image description.
|
|
.TP
|
|
.B exif_artist
|
|
Artist or photographer name.
|
|
.TP
|
|
.B exif_copyright
|
|
Copyright information.
|
|
.TP
|
|
.B exif_orientation
|
|
Image orientation.
|
|
.TP
|
|
.B exif_flash
|
|
Flash status.
|
|
.TP
|
|
.B exif_color_space
|
|
Color space.
|
|
.TP
|
|
.BR exif_exposure_program " or " exif_exp_program
|
|
Exposure program.
|
|
.TP
|
|
.BR exif_exposure_bias " or " exif_exp_bias
|
|
Exposure bias value.
|
|
.TP
|
|
.BR exif_white_balance " or " exif_wb
|
|
White balance mode.
|
|
.TP
|
|
.B exif_metering_mode
|
|
Metering mode.
|
|
.TP
|
|
.BR exif_scene_type " or " exif_scene
|
|
Scene capture type.
|
|
.TP
|
|
.B exif_contrast
|
|
Contrast setting.
|
|
.TP
|
|
.B exif_saturation
|
|
Saturation setting.
|
|
.TP
|
|
.B exif_sharpness
|
|
Sharpness setting.
|
|
.TP
|
|
.BR exif_body_serial " or " exif_serial
|
|
Camera body serial number.
|
|
.TP
|
|
.B exif_lens_serial
|
|
Lens serial number.
|
|
.TP
|
|
.BR exif_user_comment " or " exif_comment
|
|
User comment.
|
|
.TP
|
|
.BR exif_image_width " or " exif_width
|
|
Image width from EXIF.
|
|
.TP
|
|
.BR exif_image_height " or " exif_height
|
|
Image height from EXIF.
|
|
.TP
|
|
.B exif_max_aperture
|
|
Max aperture value of the lens.
|
|
.TP
|
|
.BR exif_digital_zoom " or " exif_dzoom
|
|
Digital zoom ratio.
|
|
.SS MIME and file type shortcuts
|
|
.TP
|
|
.B mime
|
|
MIME type string.
|
|
.TP
|
|
.B line_count
|
|
Number of lines in a text file.
|
|
.TP
|
|
.BR word_count " or " words
|
|
Number of whitespace-separated words in a text file.
|
|
.TP
|
|
.BR char_count " or " chars
|
|
Number of characters in a text file.
|
|
.TP
|
|
.B encoding
|
|
Detected text encoding (e.g. ASCII, UTF-8, UTF-16LE), or empty for binary files.
|
|
.TP
|
|
.B has_bom
|
|
True if the file begins with a byte-order mark (BOM).
|
|
.TP
|
|
.BR line_ending " or " line_endings " or " eol
|
|
Line ending style of a text file (LF, CRLF, CR, Mixed, or empty).
|
|
.TP
|
|
.B is_archive
|
|
True if extension matches a known archive format
|
|
(.7z, .bz2, .gz, .rar, .tar, .xz, .zip, and others).
|
|
.TP
|
|
.B is_audio
|
|
True if extension matches a known audio format
|
|
(.aac, .flac, .mp3, .ogg, .wav, .wma, and others).
|
|
.TP
|
|
.B is_book
|
|
True if extension matches a known book format
|
|
(.epub, .fb2, .mobi, .pdf, and others).
|
|
.TP
|
|
.B is_doc
|
|
True if extension matches a known document format
|
|
(.doc, .docx, .odt, .pdf, .ppt, .xls, and others).
|
|
.TP
|
|
.B is_font
|
|
True if extension matches a known font format
|
|
(.otf, .ttf, .woff, .woff2, and others).
|
|
.TP
|
|
.B is_image
|
|
True if extension matches a known image format
|
|
(.bmp, .gif, .jpeg, .jpg, .png, .svg, .webp, and others).
|
|
.TP
|
|
.B is_source
|
|
True if extension matches a known source code format
|
|
(.c, .cpp, .go, .java, .js, .py, .rs, .ts, and others).
|
|
.TP
|
|
.B is_video
|
|
True if extension matches a known video format
|
|
(.avi, .mkv, .mov, .mp4, .webm, .wmv, and others).
|
|
.SS File hashes
|
|
.TP
|
|
.B sha1
|
|
SHA-1 digest.
|
|
.TP
|
|
.BR sha2_256 " or " sha256
|
|
SHA-256 digest.
|
|
.TP
|
|
.BR sha2_512 " or " sha512
|
|
SHA-512 digest.
|
|
.TP
|
|
.BR sha3_512 " or " sha3
|
|
SHA3-512 digest.
|
|
.SH FUNCTIONS
|
|
.SS Aggregate functions
|
|
Queries using these functions return a single result row.
|
|
.TP
|
|
.B AVG
|
|
Average value.
|
|
.TP
|
|
.B COUNT
|
|
Number of rows.
|
|
.TP
|
|
.B MAX
|
|
Maximum value.
|
|
.TP
|
|
.B MIN
|
|
Minimum value.
|
|
.TP
|
|
.B SUM
|
|
Sum of all values.
|
|
.TP
|
|
.BR STDDEV_POP " / " STDDEV " / " STD
|
|
Population standard deviation.
|
|
.TP
|
|
.B STDDEV_SAMP
|
|
Sample standard deviation.
|
|
.TP
|
|
.BR VAR_POP " / " VARIANCE
|
|
Population variance.
|
|
.TP
|
|
.B VAR_SAMP
|
|
Sample variance.
|
|
.SS Date functions
|
|
.TP
|
|
.BR CURRENT_DATE " / " CUR_DATE " / " CURDATE
|
|
Current date.
|
|
.TP
|
|
.BR CURRENT_TIME " / " CUR_TIME " / " CURTIME
|
|
Current local time (HH:MM:SS).
|
|
.TP
|
|
.BR CURRENT_TIMESTAMP " / " NOW
|
|
Current local timestamp (YYYY-MM-DD HH:MM:SS).
|
|
.TP
|
|
.B DAY
|
|
Day of the month.
|
|
.TP
|
|
.B MONTH
|
|
Month of the year.
|
|
.TP
|
|
.B YEAR
|
|
Year.
|
|
.TP
|
|
.BR DOW " / " DAYOFWEEK
|
|
Day of the week (1 = Sunday, 2 = Monday, \&...).
|
|
.TP
|
|
.B DAYNAME
|
|
Name of the day of the week (e.g., Monday, Tuesday).
|
|
.TP
|
|
.BR DOY " / " DAYOFYEAR
|
|
Day of the year (1\(en366).
|
|
.TP
|
|
.BR DATE_ADD " / " DATEADD "(date, days)"
|
|
Add
|
|
.I days
|
|
to a date and return the resulting datetime.
|
|
.TP
|
|
.BR DATE_SUB " / " DATESUB "(date, days)"
|
|
Subtract
|
|
.I days
|
|
from a date and return the resulting datetime.
|
|
.TP
|
|
.BR DATE_DIFF " / " DATEDIFF "(date1, date2)"
|
|
Number of days between
|
|
.I date1
|
|
and
|
|
.IR date2 .
|
|
.TP
|
|
.BR FROM_UNIXTIME "(timestamp)"
|
|
Convert a Unix timestamp (seconds since epoch) to a datetime string.
|
|
.TP
|
|
.BR LAST_DAY " / " LAST_DATE "(date)"
|
|
Last day of the month for the given date.
|
|
.TP
|
|
.BR EXTRACT "(unit, date)"
|
|
Extract a date/time part from
|
|
.IR date .
|
|
The
|
|
.I unit
|
|
must be a quoted string. Supported units:
|
|
.BR year ", " quarter ", " month ", " week " (ISO), "
|
|
.BR day ", " hour ", " minute ", " second ", "
|
|
.BR dow " (1=Sun..7=Sat), "
|
|
.BR isodow " (1=Mon..7=Sun), "
|
|
.BR doy ", " epoch
|
|
(Unix timestamp).
|
|
.TP
|
|
.BR DATE_TRUNC " / " DATETRUNC "(unit, date)"
|
|
Truncate
|
|
.I date
|
|
to a unit boundary, returned as
|
|
.RB \(lq YYYY\-MM\-DD\ HH:MM:SS \(rq.
|
|
The
|
|
.I unit
|
|
must be a quoted string. Supported units:
|
|
.BR year ", " quarter ", " month ", "
|
|
.BR week " (truncates to Monday), "
|
|
.BR day ", " hour ", " minute ", " second .
|
|
.SS String functions
|
|
.TP
|
|
.BR LENGTH " / " LEN
|
|
Length of the string value.
|
|
.TP
|
|
.BR LOWER " / " LOWERCASE " / " LCASE
|
|
Convert to lowercase.
|
|
.TP
|
|
.BR UPPER " / " UPPERCASE " / " UCASE
|
|
Convert to uppercase.
|
|
.TP
|
|
.B INITCAP
|
|
First letter of each word uppercase, rest lowercase.
|
|
.TP
|
|
.BR TO_BASE64 " / " BASE64
|
|
Encode to Base64.
|
|
.TP
|
|
.B FROM_BASE64
|
|
Decode from Base64.
|
|
.TP
|
|
.B CONCAT
|
|
Concatenate expression values.
|
|
.TP
|
|
.B CONCAT_WS
|
|
Concatenate expression values with a delimiter.
|
|
.TP
|
|
.BR LOCATE " / " POSITION "(str, substr [, pos])"
|
|
Position of
|
|
.I substr
|
|
in
|
|
.IR str .
|
|
.TP
|
|
.BR SUBSTRING " / " SUBSTR "(str, pos [, len])"
|
|
Substring starting at
|
|
.IR pos .
|
|
Negative
|
|
.I pos
|
|
counts from the end.
|
|
.TP
|
|
.BR REPLACE "(str, from, to)"
|
|
Replace all occurrences.
|
|
.TP
|
|
.B TRIM
|
|
Strip whitespace from both ends.
|
|
.TP
|
|
.B LTRIM
|
|
Strip whitespace from the left.
|
|
.TP
|
|
.B RTRIM
|
|
Strip whitespace from the right.
|
|
.SS Numeric functions
|
|
.TP
|
|
.BR BIN " / " HEX " / " OCT
|
|
Convert integer to binary, hexadecimal, or octal.
|
|
.TP
|
|
.B ABS
|
|
Absolute value.
|
|
.TP
|
|
.BR POWER " / " POW
|
|
Raise to a power.
|
|
.TP
|
|
.B SQRT
|
|
Square root.
|
|
.TP
|
|
.B LOG
|
|
Common logarithm.
|
|
.TP
|
|
.B LN
|
|
Natural logarithm.
|
|
.TP
|
|
.B EXP
|
|
Euler's number raised to the given power.
|
|
.TP
|
|
.B LEAST
|
|
Smallest of the given values.
|
|
.TP
|
|
.B GREATEST
|
|
Largest of the given values.
|
|
.TP
|
|
.B PI
|
|
The constant π.
|
|
.TP
|
|
.B FLOOR
|
|
Largest integer not greater than the value.
|
|
.TP
|
|
.BR CEIL " / " CEILING
|
|
Smallest integer not less than the value.
|
|
.TP
|
|
.B ROUND
|
|
Nearest integer.
|
|
.TP
|
|
.BR RANDOM " / " RAND
|
|
Random integer.
|
|
With no argument: 0 to max int.
|
|
With one argument: 0 to
|
|
.IR arg .
|
|
With two arguments: from
|
|
.I arg1
|
|
to
|
|
.IR arg2 .
|
|
.SS Character detection functions
|
|
.TP
|
|
.BR CONTAINS_JAPANESE " / " JAPANESE
|
|
True if the string contains Japanese characters.
|
|
.TP
|
|
.BR CONTAINS_HIRAGANA " / " HIRAGANA
|
|
True if the string contains Hiragana characters.
|
|
.TP
|
|
.BR CONTAINS_KATAKANA " / " KATAKANA
|
|
True if the string contains Katakana characters.
|
|
.TP
|
|
.BR CONTAINS_KANA " / " KANA
|
|
True if the string contains Kana characters (Hiragana or Katakana).
|
|
.TP
|
|
.BR CONTAINS_KANJI " / " KANJI
|
|
True if the string contains Kanji characters.
|
|
.TP
|
|
.BR CONTAINS_GREEK " / " GREEK
|
|
True if the string contains Greek characters.
|
|
.SS Other functions
|
|
.TP
|
|
.B CONTAINS
|
|
True if the file contains the given string.
|
|
.TP
|
|
.B COALESCE
|
|
First non-empty value from the argument list.
|
|
.TP
|
|
.BR FORMAT_TIME " / " PRETTY_TIME
|
|
Human-readable duration (e.g.,
|
|
.IR "2min 26s" ).
|
|
.TP
|
|
.BR FORMAT_SIZE " / " FORMAT_FILESIZE
|
|
Formatted file size.
|
|
The optional second argument is a format specifier such as
|
|
.B "%.2 d"
|
|
(two decimal places, 1000-based units).
|
|
.SS Extended attribute and ACL functions
|
|
.TP
|
|
.BR HAS_XATTR "(name)"
|
|
True if the named xattr exists.
|
|
.TP
|
|
.BR XATTR "(name)"
|
|
Value of the named xattr.
|
|
.TP
|
|
.BR HAS_EXTATTR "(flag)"
|
|
True if the given
|
|
.BR lsattr (1)
|
|
flag is set.
|
|
Available only on Linux.
|
|
.TP
|
|
.BR HAS_ACL_ENTRY "(entry)"
|
|
True if the specified ACL entry exists.
|
|
Entry format:
|
|
.BR type : qualifier
|
|
(e.g.,
|
|
.BR user:john ,
|
|
.BR group:staff ).
|
|
.TP
|
|
.BR ACL_ENTRY "(entry)"
|
|
Permissions for the specified ACL entry.
|
|
.TP
|
|
.BR HAS_DEFAULT_ACL_ENTRY "(entry)"
|
|
True if the specified default ACL entry exists.
|
|
.TP
|
|
.BR DEFAULT_ACL_ENTRY "(entry)"
|
|
Permissions for the specified default ACL entry.
|
|
.TP
|
|
.BR HAS_CAPABILITY " / " HAS_CAP "(cap)"
|
|
True if the file has the given Linux capability.
|
|
.SS User functions
|
|
Available only on Unix when the
|
|
.B users
|
|
feature is enabled.
|
|
.TP
|
|
.BR CURRENT_UID ()
|
|
Current real UID.
|
|
.TP
|
|
.BR CURRENT_USER ()
|
|
Name of the current real UID.
|
|
.TP
|
|
.BR CURRENT_GID ()
|
|
Current primary GID.
|
|
.TP
|
|
.BR CURRENT_GROUP ()
|
|
Name of the current primary GID.
|
|
.SH FILE SIZE UNITS
|
|
Size comparisons and the
|
|
.B fsize
|
|
column understand the following unit suffixes:
|
|
.PP
|
|
.RS
|
|
.nf
|
|
\fBt\fR or \fBtib\fR tebibyte 1024^4 bytes
|
|
\fBtb\fR terabyte 1000^4 bytes
|
|
\fBg\fR or \fBgib\fR gibibyte 1024^3 bytes
|
|
\fBgb\fR gigabyte 1000^3 bytes
|
|
\fBm\fR or \fBmib\fR mebibyte 1024^2 bytes
|
|
\fBmb\fR megabyte 1000^2 bytes
|
|
\fBk\fR or \fBkib\fR kibibyte 1024 bytes
|
|
\fBkb\fR kilobyte 1000 bytes
|
|
.fi
|
|
.RE
|
|
.SH SEARCH ROOTS
|
|
Each search root may be followed by one or more options:
|
|
.TP
|
|
.BI mindepth " N"
|
|
Minimum search depth. Depth 1 skips the root directory itself and starts at its children.
|
|
.TP
|
|
.BI maxdepth " N"
|
|
Maximum search depth.
|
|
Depth 1 searches only the root directory.
|
|
Depth 2 also searches immediate subdirectories.
|
|
Synonym:
|
|
.BR depth .
|
|
.TP
|
|
.BR symlinks " / " sym
|
|
Follow symbolic links. Default is not to follow.
|
|
.TP
|
|
.BR archives " / " arc
|
|
Search inside archives (zip only). Default is not to search archives.
|
|
.TP
|
|
.BR gitignore " / " git
|
|
Respect
|
|
.B .gitignore
|
|
files.
|
|
.TP
|
|
.BR hgignore " / " hg
|
|
Respect
|
|
.B .hgignore
|
|
files.
|
|
.TP
|
|
.BR dockerignore " / " dock
|
|
Respect
|
|
.B .dockerignore
|
|
files.
|
|
.TP
|
|
.BR nogitignore " / " nogit
|
|
Disable
|
|
.B .gitignore
|
|
parsing.
|
|
.TP
|
|
.BR nohgignore " / " nohg
|
|
Disable
|
|
.B .hgignore
|
|
parsing.
|
|
.TP
|
|
.BR nodockerignore " / " nodock
|
|
Disable
|
|
.B .dockerignore
|
|
parsing.
|
|
.TP
|
|
.B dfs
|
|
Depth-first traversal.
|
|
.TP
|
|
.B bfs
|
|
Breadth-first traversal (default).
|
|
.TP
|
|
.BR regexp " / " rx
|
|
Treat the root path as a regular expression matching against multiple directories.
|
|
.SH OPERATORS
|
|
.SS Comparison operators
|
|
.TP
|
|
.BR = " / " == " / " eq
|
|
Equal (with glob expansion and regular expression matching for strings).
|
|
.TP
|
|
.BR != " / " <> " / " ne
|
|
Not equal.
|
|
.TP
|
|
.BR === " / " eeq
|
|
Exact equal (no glob or regex expansion).
|
|
.TP
|
|
.BR !== " / " ene
|
|
Exact not-equal.
|
|
.TP
|
|
.BR > " / " gt
|
|
Greater than.
|
|
.TP
|
|
.BR >= " / " gte " / " ge
|
|
Greater than or equal.
|
|
.TP
|
|
.BR < " / " lt
|
|
Less than.
|
|
.TP
|
|
.BR <= " / " lte " / " le
|
|
Less than or equal.
|
|
.TP
|
|
.BR =~ " / " ~= " / " regexp " / " rx
|
|
Match regular expression.
|
|
.TP
|
|
.BR !=~ " / " !~= " / " notrx
|
|
Does not match regular expression.
|
|
.TP
|
|
.B like
|
|
SQL LIKE pattern (
|
|
.B %
|
|
matches any sequence,
|
|
.B _
|
|
matches one character).
|
|
.TP
|
|
.B notlike
|
|
Negation of
|
|
.BR like .
|
|
.TP
|
|
.B between
|
|
Range check:
|
|
.IB column " between " val1 " and " val2
|
|
.TP
|
|
.B in
|
|
Set membership:
|
|
.IB column " in (" val1 ", " val2 ", ...)"
|
|
or
|
|
.IB column " in (subquery)" .
|
|
.TP
|
|
.B exists
|
|
Row existence test:
|
|
.B exists (subquery)
|
|
.SS Arithmetic operators
|
|
.TP
|
|
.BR + " / " plus
|
|
Addition.
|
|
.TP
|
|
.BR - " / " minus
|
|
Subtraction.
|
|
.TP
|
|
.BR * " / " mul
|
|
Multiplication.
|
|
.TP
|
|
.BR / " / " div
|
|
Division.
|
|
.TP
|
|
.BR % " / " mod
|
|
Modulo.
|
|
.SS Logical operators
|
|
.TP
|
|
.B and
|
|
Logical conjunction.
|
|
.TP
|
|
.B or
|
|
Logical disjunction.
|
|
.TP
|
|
.B not
|
|
Logical negation. May appear before an operator or a condition.
|
|
.SH DATE AND TIME SPECIFIERS
|
|
When the
|
|
.B =
|
|
or
|
|
.B !=
|
|
operator is used with an inexact date, it is treated as an interval:
|
|
.PP
|
|
.RS
|
|
.TP
|
|
.B 2017-05-01
|
|
The entire day (00:00:00 to 23:59:59).
|
|
.TP
|
|
.B "2017-05-01 15"
|
|
One hour (15:00:00 to 15:59:59).
|
|
.TP
|
|
.B "2017-05-01 15:10"
|
|
One minute (15:10:00 to 15:10:59).
|
|
.RE
|
|
.PP
|
|
Other comparison operators accept more flexible date expressions:
|
|
.B today ,
|
|
.B yesterday ,
|
|
.B "last fri" ,
|
|
.B "apr 1" ,
|
|
.B 2017-05-01 ,
|
|
and numeric relative offsets (e.g.,
|
|
.B -2
|
|
means two days ago).
|
|
.PP
|
|
Dates default to UK locale (DD/MM). Use
|
|
.B \-\-us\-dates
|
|
or
|
|
.B us_dates = true
|
|
in the config file to switch to US format.
|
|
The safest representation is ISO 8601:
|
|
.BR "YYYY-MM-DD HH:MM:SS" .
|
|
.SH REGULAR EXPRESSIONS
|
|
Rust-flavor regular expressions are used (see
|
|
.BR regex (7)
|
|
or the online documentation at https://docs.rs/regex).
|
|
.SH SUBQUERIES
|
|
Subqueries may be used with the
|
|
.BR in ", " "not in" ", " exists ", and " "not exists"
|
|
operators.
|
|
To reference columns from an outer query in a correlated subquery, bind the search root with an alias using the
|
|
.B as
|
|
keyword:
|
|
.PP
|
|
.RS
|
|
.EX
|
|
fselect "name, path, size from /data as data
|
|
where exists (select * from /backup as backup
|
|
where backup.name = data.name)"
|
|
.EE
|
|
.RE
|
|
.SH OUTPUT FORMATS
|
|
Specified with the
|
|
.B into
|
|
keyword at the end of the query.
|
|
.TP
|
|
.B tabs
|
|
Tab-separated columns (default).
|
|
.TP
|
|
.B lines
|
|
Each column on a separate line.
|
|
.TP
|
|
.B list
|
|
Columns separated by a NUL byte, similar to
|
|
.B find \-print0
|
|
(suitable for
|
|
.BR "xargs \-0" ).
|
|
.TP
|
|
.B csv
|
|
Comma-separated values.
|
|
.TP
|
|
.B json
|
|
JSON array of result objects.
|
|
.TP
|
|
.B html
|
|
HTML document containing a table.
|
|
.SH CONFIGURATION FILE
|
|
On Linux:
|
|
.RS
|
|
.B ~/.config/fselect/config.toml
|
|
.RE
|
|
.PP
|
|
On Windows:
|
|
.RS
|
|
.B %APPDATA%\ejhspetersson\efselect\econfig.toml
|
|
.RE
|
|
.PP
|
|
If no config file is found on the standard paths,
|
|
.B fselect
|
|
also looks for a config file next to the executable.
|
|
A custom path may be supplied with
|
|
.BR \-\-config .
|
|
.SH INTERACTIVE MODE
|
|
Start with
|
|
.BR "fselect \-i" .
|
|
In interactive mode:
|
|
.IP \(bu
|
|
Queries are entered directly without quoting for the shell.
|
|
.IP \(bu
|
|
Shell metacharacters need not be escaped.
|
|
.IP \(bu
|
|
Command history is available via the up and down arrow keys.
|
|
.IP \(bu
|
|
.B pwd
|
|
prints the current directory;
|
|
.B cd
|
|
changes it.
|
|
.IP \(bu
|
|
.B "errors off"
|
|
suppresses error reporting.
|
|
.IP \(bu
|
|
Exit with
|
|
.BR quit ,
|
|
.BR exit ,
|
|
Ctrl+C, or Ctrl+D.
|
|
.SH ENVIRONMENT
|
|
.TP
|
|
.B LS_COLORS
|
|
Determines how search results are colorized; see
|
|
.BR dircolors (1).
|
|
.TP
|
|
.B NO_COLOR
|
|
When set (to any value), disables all colorized output.
|
|
.SH EXIT STATUS
|
|
.TP
|
|
.B 0
|
|
Success.
|
|
.TP
|
|
.B 1
|
|
I/O error during directory traversal or file reading.
|
|
.TP
|
|
.B 2
|
|
Query parse error, or a fatal error while evaluating the query
|
|
(e.g. an invalid root alias).
|
|
.SH EXAMPLES
|
|
.TP
|
|
Find temporary and config files, showing size and full path:
|
|
$ fselect size, path from /home/user where name = '*.cfg' or name = '*.tmp'
|
|
.TP
|
|
Search in a directory whose name contains spaces:
|
|
$ fselect "name from '/home/user/dir with spaces' where size > 0"
|
|
.TP
|
|
Find large files (over 2 GiB):
|
|
$ fselect size, abspath from ./tmp where size gt 2g
|
|
.TP
|
|
Find files within a size range:
|
|
$ fselect name, size from ./tmp where size between 5mb and 6mb
|
|
.TP
|
|
Complex boolean condition:
|
|
$ fselect "name from /tmp where (name = *.tmp and size = 0) or (name = *.cfg and size > 1000000)"
|
|
.TP
|
|
Find files modified today, ordered by size:
|
|
$ fselect path, size from /home/user where modified = today order by size desc
|
|
.TP
|
|
Find files by regular expression:
|
|
$ fselect name from /home/user where path =~ '.*Rust.*'
|
|
.TP
|
|
Aggregate: total size of downloads:
|
|
$ fselect "MIN(size), MAX(size), AVG(size), SUM(size), COUNT(*) from /home/user/Downloads"
|
|
.TP
|
|
Group files by extension with count:
|
|
$ fselect "ext, count(*) from /tmp group by ext"
|
|
.TP
|
|
Search with depth limit and symlink following:
|
|
$ fselect path from /home/user depth 5 symlinks where name = '*.jpg'
|
|
.TP
|
|
Search respecting .gitignore:
|
|
$ fselect size, path from /home/user/projects gitignore where name = '*.cpp'
|
|
.TP
|
|
Find images by dimensions:
|
|
$ fselect path from /home/user/photos where width gte 2000 or height gte 2000
|
|
.TP
|
|
Find old rap MP3s:
|
|
$ fselect duration, path from /home/user/music where genre = Rap and bitrate = 320 and mp3_year lt 2000
|
|
.TP
|
|
Find files with dangerous permissions:
|
|
$ fselect mode, path from /home/user where other_write or other_exec
|
|
.TP
|
|
Find files not present in a backup directory:
|
|
$ fselect "name, path from /current where name not in (select name from /backup)"
|
|
.TP
|
|
Output as JSON:
|
|
$ fselect size, path from /home/user limit 5 into json
|
|
.TP
|
|
Pipe NUL-separated paths to grep:
|
|
$ fselect path from /home/user into list | xargs -0 grep foobar
|
|
.SH SEE ALSO
|
|
.BR find (1),
|
|
.BR fd (1),
|
|
.BR ls (1),
|
|
.BR dircolors (1)
|