FSELECT(1)
๐ NAME ๐
okay bestie, this is the iconic fselect(1) page from the General Commands Manual โ a command-line utility for finding files with SQL-like queries. It's giving search-but-make-it-query-language, and honestly? Obsessed. ๐
โจ SYNOPSIS โจ
here's the shape of it, bestie โ copy these exactly:
fselect [--nocolor] [--no-errors] [--us-dates] [--config FILE]
fselect COLUMN [, COLUMN ...] [from ROOT [, ROOT ...]] [where EXPR]
[group by COLUMNS] [having EXPR] [order by COLUMNS] [limit N] [offset N]
[into FORMAT]
fselect -i
๐ฆ DESCRIPTION ๐ฆ
okay so fselect is a command-line utility for finding files using an SQL-like query language. The fselect command itself acts as the select keyword (i.e., file select). An optional select keyword at the beginning of the query is accepted but not required โ you can literally skip it if you're feeling casual. ๐
Query columns may be file attributes, arbitrary string literals (quoted if they contain spaces), function calls, or arithmetic expressions. Slay, versatile icon behavior. โจ
If 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.). Highkey main character energy for every root, fr fr. ๐
๐จ bestie, important vibe check: queries containing>,<, parentheses, or shell metacharacters such as*and?should be enclosed in double quotes to prevent shell interpretation. Protect the query. Periodt. ๐
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. lowkey flexible, highkey iconic. ๐ฆ
๐ธ OPTIONS ๐ธ
--interactive,-iโ Run in interactive mode. it's giving choose-your-own-adventure, but make it files ๐ฎ--config FILEโ Specify an alternative configuration file location. custom config bestie behavior ๐--nocolor,--no-colorโ Disable colorized output. let your terminal be its natural, unbothered self ๐--no-errorsโ Suppress error messages. quiet-luxury era, no drama ๐--us-datesโ Interpret ambiguous dates in US format (MM/DD) instead of the default UK format (DD/MM). US-format bestie mode activated ๐บ๐ธโจ--help,-hโ Show help and exit. the โwait, how does this work again?โ button ๐ซถ
โจ COLUMNS AND FIELDS โจ
okay so these are the literal column and field names, bestie ๐ like the whole menu of stuff this page knows how to talk about. no cap, every single one is listed here.
๐ File naming ๐
nameโ the full file name, extension included.filename,fnameโ the file name without its extension.extension,extโ just the extension, with no leading dot.pathโ the path relative to the search root.abspathโ the absolute path of the file.directory,dirname,dirโ the directory part of the path, relative to the search root.absdirโ the absolute directory part of the path.link_target,symlink_targetโ the target path of a symlink, or empty if the file is not a symlink.
๐ง File naming terminology ๐ง
so if your search root is /home/user/projects and the file is sitting at /home/user/projects/foobar/content/readme.md, then it breaks down like this:
abspath /home/user/projects/foobar/content/readme.md
absdir /home/user/projects/foobar/content
path foobar/content/readme.md
dir foobar/content
name readme.md
filename readme
ext md
๐ Size ๐
sizeโ the file size in bytes.fsize,hsizeโ a human-readable size with a unit suffix.
๐ฐ๏ธ Timestamps ๐ฐ๏ธ
accessedโ when the file was last accessed (YYYY-MM-DD HH:MM:SS).createdโ the file creation time (YYYY-MM-DD HH:MM:SS).modifiedโ when the file was last modified (YYYY-MM-DD HH:MM:SS).
โ Type tests (boolean) โ
these ones are giving very โtrue or false, bestieโ energy ๐
is_dirโtrueif the path is a directory.is_fileโtrueif the path is a regular file.is_symlinkโtrueif the path is a symbolic link.is_broken_symlink,is_broken_linkโtrueif the path is a symbolic link whose target does not exist.is_pipe,is_fifoโtrueif the path is a FIFO or named pipe.is_char,is_characterโtrueif the path is a character special file.is_blockโtrueif the path is a block special file.is_socketโtrueif the path is a socket.is_hiddenโtrueif the file is hidden (starts with a dot on Unix).is_emptyโtrueif the file is empty or the directory contains no entries.is_shebangโtrueif the file begins with a shebang (#!).is_binaryโtrueif MIME type detection identifies the file as binary.is_textโtrueif MIME type detection identifies the file as text.
๐ Git ๐
is_git_repoโtrueif the directory contains a.gitsubdirectory or file (i.e., is the root of a git repository).is_git_tracked,git_trackedโtrueif the file is tracked by git.is_gitignored,is_git_ignoredโtrueif the file is ignored by git.git_statusโ the fileโs git status:clean,modified,staged,untracked,conflicted, orignored.git_branchโ the current branch of the git repository that contains the file.git_last_commit_hash,git_commit_hashโ the hash of the last commit that touched the file.git_last_commit_date,git_commit_dateโ the date of the last commit that touched the file.git_last_commit_author,git_commit_authorโ the author of the last commit that touched the file.
๐ Permissions ๐
modeโ the full permission string, similar to the first column ofls -la.uid/gidโ numeric user ID / group ID of the owner.user/groupโ the name of the owner / ownerโs group. Available only on Unix when theusersfeature is enabled.user_read,user_write,user_exec,user_all/user_rwxโ per-owner permission bits.group_read,group_write,group_exec,group_all/group_rwxโ per-group permission bits.other_read,other_write,other_exec,other_all/other_rwxโ permission bits for other users.suid,is_suidโ the SUID bit.sgid,is_sgidโ the SGID bit.is_sticky,stickyโ the sticky bit.
๐ง Unix/Linux-specific ๐ง
deviceโ the device number the file resides on.rdevโ the device ID for special files (character and block devices).inodeโ the inode number.blocksโ the number of 512-byte blocks allocated.blksize,block_sizeโ the preferred block size for filesystem I/O, in bytes.hardlinksโ the number of hard links.atimeโ the last access time as a Unix timestamp (seconds since epoch).atime_nsecโ the nanosecond component of the last access time.mtimeโ the last modification time as a Unix timestamp (seconds since epoch).mtime_nsecโ the nanosecond component of the last modification time.ctimeโ the last status change time as a Unix timestamp (seconds since epoch).ctime_nsecโ the nanosecond component of the last status change time.has_xattrsโtrueif the file has extended attributes (xattrs).xattr_countโ the number of extended attributes (xattrs) on the file, or alternate data streams on Windows.extattrsโ extended file attribute flags as reported bylsattr(1)(single-letter codes).has_extattrsโtrueif anyextattrsflag is set.aclโ all ACL entries in standard form, comma-separated. On Linux, returns POSIX ACL entries ingetfacl(1)format. On Windows, returns explicit DACL entries astype:trustee:permissions(e.g.,allow:BUILTIN\Administrators:full). Permission labels:full,modify,rx,read,write, or a hex value for non-standard masks. Available only on Linux and Windows.has_aclโtrueif the file has POSIX ACL entries beyond standard Unix permissions or explicit (non-inherited) Windows DACL entries.default_aclโ all default POSIX ACL entries in standard form, comma-separated. Available only on Linux.has_default_aclโtrueif the directory has default POSIX ACL entries.has_capabilities,has_capsโtrueif the file has Linux capabilities. Available only on Linux.capabilities,capsโ the Linux capabilities string assigned to the file.
๐ฌ Media ๐ฌ
width/heightโ width and height of an image or MP4 video, in pixels.durationโ duration of an audio file, in seconds.mp3_bitrate,bitrateโ audio bitrate in kbps.mp3_freq,freqโ audio sampling frequency.mp3_title,titleโ track title from audio metadata.mp3_artist,artistโ artist name from audio metadata.mp3_album,albumโ album name from audio metadata.mp3_genre,genreโ genre from audio metadata.mp3_comment,commentโ comment from audio metadata.mp3_track,trackโ track number from audio metadata (e.g.4or4/9).mp3_disc,discโ disc number (part of a set) from audio metadata (e.g.1or1/2).mp3_year,audio_yearโ year from audio metadata.
๐ธ EXIF metadata ๐ธ
exif_datetimeโ date and time recorded in EXIF data.exif_datetime_original,exif_dtoโ the original date and time when the photo was taken.exif_altitude,exif_altโ GPS altitude.exif_latitude,exif_latโ GPS latitude.exif_longitude,exif_lng,exif_lonโ GPS longitude.exif_make/exif_modelโ camera manufacturer and model.exif_softwareโ software used to create the image.exif_versionโ version of EXIF metadata.exif_exposure_time,exif_exptimeโ exposure time.exif_apertureโ aperture value.exif_shutter_speedโ shutter speed.exif_f_number,exif_f_numโ F-number.exif_iso_speed,exif_isoโ ISO speed (EXIF 2.3 ISOSpeed tag).exif_sensitivity,exif_photo_sensitivityโ photographic sensitivity (ISO).exif_focal_length,exif_focal_lenโ focal length.exif_lens_make/exif_lens_modelโ lens manufacturer and model.exif_description,exif_descโ image description.exif_artistโ artist or photographer name.exif_copyrightโ copyright information.exif_orientationโ image orientation.exif_flashโ flash status.exif_color_spaceโ color space.exif_exposure_program,exif_exp_programโ exposure program.exif_exposure_bias,exif_exp_biasโ exposure bias value.exif_white_balance,exif_wbโ white balance mode.exif_metering_modeโ metering mode.exif_scene_type,exif_sceneโ scene capture type.exif_contrastโ contrast setting.exif_saturationโ saturation setting.exif_sharpnessโ sharpness setting.exif_body_serial,exif_serialโ camera body serial number.exif_lens_serialโ lens serial number.exif_user_comment,exif_commentโ user comment.exif_image_width,exif_widthโ image width from EXIF.exif_image_height,exif_heightโ image height from EXIF.exif_max_apertureโ max aperture value of the lens.exif_digital_zoom,exif_dzoomโ digital zoom ratio.
๐งฌ MIME and file type shortcuts ๐งฌ
mimeโ MIME type string.line_countโ number of lines in a text file.word_count,wordsโ number of whitespace-separated words in a text file.char_count,charsโ number of characters in a text file.encodingโ detected text encoding (e.g.ASCII,UTF-8,UTF-16LE), or empty for binary files.has_bomโtrueif the file begins with a byte-order mark (BOM).line_ending,line_endings,eolโ line ending style of a text file (LF,CRLF,CR,Mixed, or empty).is_archiveโtrueif the extension matches a known archive format (.7z,.bz2,.gz,.rar,.tar,.xz,.zip, and others).is_audioโtrueif the extension matches a known audio format (.aac,.flac,.mp3,.ogg,.wav,.wma, and others).is_bookโtrueif the extension matches a known book format (.epub,.fb2,.mobi,.pdf, and others).is_docโtrueif the extension matches a known document format (.doc,.docx,.odt,.pdf,.ppt,.xls, and others).is_fontโtrueif the extension matches a known font format (.otf,.ttf,.woff,.woff2, and others).is_imageโtrueif the extension matches a known image format (.bmp,.gif,.jpeg,.jpg,.png,.svg,.webp, and others).is_sourceโtrueif the extension matches a known source code format (.c,.cpp,.go,.java,.js,.py,.rs,.ts, and others).is_videoโtrueif the extension matches a known video format (.avi,.mkv,.mov,.mp4,.webm,.wmv, and others).
๐ File hashes ๐
sha1โ SHA-1 digest.sha2_256,sha256โ SHA-256 digest.sha2_512,sha512โ SHA-512 digest.sha3_512,sha3โ SHA3-512 digest.
๐ FUNCTIONS ๐
okay bestie, this is the built-in function menu โ every alias is listed exactly, no cap โจ
๐ Aggregate functions ๐
Queries using these functions return a single result row.
AVGโ Average value.COUNTโ Number of rows.MAXโ Maximum value.MINโ Minimum value.SUMโ Sum of all values.STDDEV_POP/STDDEV/STDโ Population standard deviation.STDDEV_SAMPโ Sample standard deviation.VAR_POP/VARIANCEโ Population variance.VAR_SAMPโ Sample variance.
๐๏ธ Date functions ๐๏ธ
CURRENT_DATE/CUR_DATE/CURDATEโ Current date.CURRENT_TIME/CUR_TIME/CURTIMEโ Current local time (HH:MM:SS).CURRENT_TIMESTAMP/NOWโ Current local timestamp (YYYY-MM-DD HH:MM:SS).DAYโ Day of the month.MONTHโ Month of the year.YEARโ Year.DOW/DAYOFWEEKโ Day of the week (1= Sunday,2= Monday, ...).DAYNAMEโ Name of the day of the week (e.g.,Monday,Tuesday).DOY/DAYOFYEARโ Day of the year (1โ366).DATE_ADD/DATEADD(date, days)โ Add days to a date and return the resulting datetime.DATE_SUB/DATESUB(date, days)โ Subtract days from a date and return the resulting datetime.DATE_DIFF/DATEDIFF(date1, date2)โ Number of days betweendate1anddate2.FROM_UNIXTIME(timestamp)โ Convert a Unix timestamp (seconds since epoch) to a datetime string.LAST_DAY/LAST_DATE(date)โ Last day of the month for the given date.EXTRACT(unit, date)โ Extract a date/time part fromdate. Theunitmust be a quoted string. Supported units:year,quarter,month,week(ISO),day,hour,minute,second,dow(1=Sun..7=Sat),isodow(1=Mon..7=Sun),doy,epoch(Unix timestamp).DATE_TRUNC/DATETRUNC(unit, date)โ Truncatedateto a unit boundary, returned as โYYYY-MM-DD HH:MM:SSโ. Theunitmust be a quoted string. Supported units:year,quarter,month,week(truncates to Monday),day,hour,minute,second.
๐ String functions ๐
LENGTH/LENโ Length of the string value.LOWER/LOWERCASE/LCASEโ Convert to lowercase.UPPER/UPPERCASE/UCASEโ Convert to uppercase.INITCAPโ First letter of each word uppercase, rest lowercase.TO_BASE64/BASE64โ Encode to Base64.FROM_BASE64โ Decode from Base64.CONCATโ Concatenate expression values.CONCAT_WSโ Concatenate expression values with a delimiter.LOCATE/POSITION(str, substr [, pos])โ Position ofsubstrinstr.SUBSTRING/SUBSTR(str, pos [, len])โ Substring starting atpos. Negativeposcounts from the end.REPLACE(str, from, to)โ Replace all occurrences.TRIMโ Strip whitespace from both ends.LTRIMโ Strip whitespace from the left.RTRIMโ Strip whitespace from the right.
๐ข Numeric functions ๐ข
BIN/HEX/OCTโ Convert integer to binary, hexadecimal, or octal.ABSโ Absolute value.POWER/POWโ Raise to a power.SQRTโ Square root.LOGโ Common logarithm.LNโ Natural logarithm.EXPโ Euler's number raised to the given power.LEASTโ Smallest of the given values.GREATESTโ Largest of the given values.PIโ The constant ฯ.FLOORโ Largest integer not greater than the value.CEIL/CEILINGโ Smallest integer not less than the value.ROUNDโ Nearest integer.RANDOM/RANDโ Random integer. With no argument:0to max int. With one argument:0toarg. With two arguments: fromarg1toarg2.
๐ธ Character detection functions ๐ธ
CONTAINS_JAPANESE/JAPANESEโ True if the string contains Japanese characters.CONTAINS_HIRAGANA/HIRAGANAโ True if the string contains Hiragana characters.CONTAINS_KATAKANA/KATAKANAโ True if the string contains Katakana characters.CONTAINS_KANA/KANAโ True if the string contains Kana characters (Hiragana or Katakana).CONTAINS_KANJI/KANJIโ True if the string contains Kanji characters.CONTAINS_GREEK/GREEKโ True if the string contains Greek characters.
๐ฆ Other functions ๐ฆ
CONTAINSโ True if the file contains the given string.COALESCEโ First non-empty value from the argument list.FORMAT_TIME/PRETTY_TIMEโ Human-readable duration (e.g.,2min 26s).FORMAT_SIZE/FORMAT_FILESIZEโ Formatted file size. The optional second argument is a format specifier such as%.2 d(two decimal places, 1000-based units).
๐ Extended attribute and ACL functions ๐
HAS_XATTR(name)โ True if the named xattr exists.XATTR(name)โ Value of the named xattr.HAS_EXTATTR(flag)โ True if the givenlsattr(1)flag is set. Available only on Linux.HAS_ACL_ENTRY(entry)โ True if the specified ACL entry exists. Entry format:type:qualifier(e.g.,user:john,group:staff).ACL_ENTRY(entry)โ Permissions for the specified ACL entry.HAS_DEFAULT_ACL_ENTRY(entry)โ True if the specified default ACL entry exists.DEFAULT_ACL_ENTRY(entry)โ Permissions for the specified default ACL entry.HAS_CAPABILITY/HAS_CAP(cap)โ True if the file has the given Linux capability.
๐ User functions ๐
Available only on Unix when the users feature is enabled.
CURRENT_UID()โ Current real UID.CURRENT_USER()โ Name of the current real UID.CURRENT_GID()โ Current primary GID.CURRENT_GROUP()โ Name of the current primary GID.
๐ฆ FILE SIZE UNITS ๐ฆ
Size comparisons and the fsize column understand the following unit suffixes:
tortibโ tebibyte โ1024^4bytestbโ terabyte โ1000^4bytesgorgibโ gibibyte โ1024^3bytesgbโ gigabyte โ1000^3bytesmormibโ mebibyte โ1024^2bytesmbโ megabyte โ1000^2byteskorkibโ kibibyte โ1024byteskbโ kilobyte โ1000bytes
๐ SEARCH ROOTS ๐
Each search root may be followed by one or more options:
mindepth Nโ Minimum search depth. Depth1skips the root directory itself and starts at its children.maxdepth Nโ Maximum search depth. Depth1searches only the root directory. Depth2also searches immediate subdirectories. Synonym:depth.symlinks/symโ Follow symbolic links. Default is not to follow.archives/arcโ Search inside archives (zip only). Default is not to search archives.gitignore/gitโ Respect.gitignorefiles.hgignore/hgโ Respect.hgignorefiles.dockerignore/dockโ Respect.dockerignorefiles.nogitignore/nogitโ Disable.gitignoreparsing.nohgignore/nohgโ Disable.hgignoreparsing.nodockerignore/nodockโ Disable.dockerignoreparsing.dfsโ Depth-first traversal.bfsโ Breadth-first traversal (default).regexp/rxโ Treat the root path as a regular expression matching against multiple directories.
๐งฎ OPERATORS ๐งฎ
โ๏ธ Comparison operators โ๏ธ
=/==/eqโ Equal (with glob expansion and regular expression matching for strings).!=/<>/neโ Not equal.===/eeqโ Exact equal (no glob or regex expansion).!==/eneโ Exact not-equal.>/gtโ Greater than.>=/gte/geโ Greater than or equal.</ltโ Less than.<=/lte/leโ Less than or equal.=~/~=/regexp/rxโ Match regular expression.!=~/!~=/notrxโ Does not match regular expression.likeโ SQL LIKE pattern (%matches any sequence,_matches one character).notlikeโ Negation oflike.betweenโ Range check:column between val1 and val2inโ Set membership:column in (val1, val2, ...)orcolumn in (subquery).existsโ Row existence test:exists (subquery)
โ Arithmetic operators โ
+/plusโ Addition.-/minusโ Subtraction.*/mulโ Multiplication.//divโ Division.%/modโ Modulo.
๐ง Logical operators ๐ง
andโ Logical conjunction.orโ Logical disjunction.notโ Logical negation. May appear before an operator or a condition.
๐๏ธ DATE AND TIME SPECIFIERS ๐๏ธ
When the = or != operator is used with an inexact date, it is treated as an interval:
2017-05-01โ The entire day (00:00:00to23:59:59).2017-05-01 15โ One hour (15:00:00to15:59:59).2017-05-01 15:10โ One minute (15:10:00to15:10:59).
Other comparison operators accept more flexible date expressions: today, yesterday, last fri, apr 1, 2017-05-01, and numeric relative offsets (e.g., -2 means two days ago).
Dates default to UK locale (DD/MM). Use --us-dates or us_dates = true in the config file to switch to US format. The safest representation is ISO 8601: YYYY-MM-DD HH:MM:SS.
๐งต REGULAR EXPRESSIONS ๐งต
Rust-flavor regular expressions are used (see regex(7) or the online documentation at https://docs.rs/regex).
๐ช SUBQUERIES ๐ช
Subqueries may be used with the 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 as keyword:
fselect "name, path, size from /data as data
where exists (select * from /backup as backup
where backup.name = data.name)"
๐ OUTPUT FORMATS ๐
Specified with the into keyword at the end of the query.
tabsโ Tab-separated columns (default).linesโ Each column on a separate line.listโ Columns separated by a NUL byte, similar tofind -print0(suitable forxargs -0).csvโ Comma-separated values.jsonโ JSON array of result objects.htmlโ HTML document containing a table.
โ๏ธ CONFIGURATION FILE โ๏ธ
- On Linux:
~/.config/fselect/config.toml - On Windows:
%APPDATA%\jhspetersson\fselect\config.toml
If no config file is found on the standard paths, fselect also looks for a config file next to the executable. A custom path may be supplied with --config.
๐น๏ธ INTERACTIVE MODE ๐น๏ธ
Start with fselect -i. In interactive mode:
- Queries are entered directly without quoting for the shell.
- Shell metacharacters need not be escaped.
- Command history is available via the up and down arrow keys.
pwdprints the current directory;cdchanges it.errors offsuppresses error reporting.- Exit with
quit,exit, Ctrl+C, or Ctrl+D.
๐ฟ ENVIRONMENT ๐ฟ
Okay so environment variables, bestie โ these are the little vibes you set outside the command and fselect lowkey respects them:
LS_COLORSโ this is the one that decides how search results get colorized, fr fr. Seedircolors(1)for the whole color situation ๐NO_COLORโ when it's set (to any value), it disables all colorized output. Not some. All. Periodt ๐
๐ฆ EXIT STATUS ๐ฆ
Exit codes are giving "read the room" energy โ here's what each one means:
0โ success, slay โจ1โ I/O error during directory traversal or file reading ๐ญ2โ query parse error, or a fatal error while evaluating the query (e.g. an invalid root alias) ๐
๐ EXAMPLES ๐
This is the part where it gets iconic. Every example is here, bestie โ no skips, no cap ๐
Find temporary and config files, showing size and full path:
$ fselect size, path from /home/user where name = '*.cfg' or name = '*.tmp'
Search in a directory whose name contains spaces:
$ fselect "name from '/home/user/dir with spaces' where size > 0"
Find large files (over 2 GiB):
$ fselect size, abspath from ./tmp where size gt 2g
Find files within a size range:
$ fselect name, size from ./tmp where size between 5mb and 6mb
Complex boolean condition:
$ fselect "name from /tmp where (name = *.tmp and size = 0) or (name = *.cfg and size > 1000000)"
Find files modified today, ordered by size:
$ fselect path, size from /home/user where modified = today order by size desc
Find files by regular expression:
$ fselect name from /home/user where path =~ '.*Rust.*'
Aggregate: total size of downloads:
$ fselect "MIN(size), MAX(size), AVG(size), SUM(size), COUNT(*) from /home/user/Downloads"
Group files by extension with count:
$ fselect "ext, count(*) from /tmp group by ext"
Filter groups after aggregation:
$ fselect "ext, count(*) from /tmp group by ext having count(*) > 10"
Search with depth limit and symlink following:
$ fselect path from /home/user depth 5 symlinks where name = '*.jpg'
Search respecting .gitignore:
$ fselect size, path from /home/user/projects gitignore where name = '*.cpp'
Find images by dimensions:
$ fselect path from /home/user/photos where width gte 2000 or height gte 2000
Find old rap MP3s:
$ fselect duration, path from /home/user/music where genre = Rap and bitrate = 320 and mp3_year lt 2000
Find files with dangerous permissions:
$ fselect mode, path from /home/user where other_write or other_exec
Find files not present in a backup directory:
$ fselect "name, path from /current where name not in (select name from /backup)"
Output as JSON:
$ fselect size, path from /home/user limit 5 into json
Pipe NUL-separated paths to grep:
$ fselect path from /home/user into list | xargs -0 grep foobar
๐ SEE ALSO ๐
The besties in the same man-page universe, iykyk: find(1), fd(1), ls(1), dircolors(1) ๐ซถ
That's the whole FSELECT(1) page, bestie โ source, version, and date are living their best life in the footer, and yes, they ate ๐
โจ๐
๐ฆ where this page comes from
- nixpkgs unstable: fselect 0.10.3
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms