12 KiB
Note
本文档由 WeHub 基于上游 README 翻译整理,属于社区翻译,非官方中文文档。
English · 原始项目 · 上游 README
原作者、版权与许可证归属以原始项目及本仓库 LICENSE 文件为准。
fselect
使用类 SQL 查询查找文件
为何使用 fselect?
虽然它通常不会完全取代传统的 find 和 ls,但 fselect 具备以下优点:
- 类 SQL(并非真正的 SQL,但语法非常宽松!)语法,易于人类理解
- 复杂查询,可通过 子查询 在多个目录间比较结果
- 聚合、统计、日期及其他 函数
- 在压缩包内搜索
- 支持
.gitignore、.hgignore和.dockerignore(实验性) - 按图片宽高、EXIF 元数据搜索
- 按音频元数据搜索(MP3、FLAC、Ogg Vorbis、Opus、M4A/AAC、WAV、AIFF、APE、WavPack、Musepack、Speex)
- 按扩展文件属性、POSIX ACL 及 Linux capabilities 搜索
- 按文件哈希搜索
- 按 MIME 类型搜索
- 常见文件类型快捷方式
- 交互模式
- 支持
plocate和Everything索引,实现闪电般快速搜索 - 多种输出格式(CSV、JSON 等)
更多功能正在开发中!
安装
从源码安装最新版本
- 安装 Rust 与 Cargo 及其依赖以构建二进制文件
- 运行
cargo install fselect
你可以选择构建带快速索引搜索支持的版本:voidtools Everything
在 Windows 上(--features everything,然后传入 --everything),或 Linux 上的 plocate
(--features plocate,然后传入 --plocate)。详见
使用指南。
Debian/Ubuntu
Fedora/RHEL/openSUSE
Arch Linux
AUR bin 软件包,,感谢 @4censord
NixOS
fselect in nixpkgs,,感谢 @filalex77
其他 Linux 发行版
Windows 64 位
提供预编译 二进制文件
通过 winget 在 Windows 上安装
- 安装 winget
- 运行
winget install -e --id fselect.fselect
通过 Chocolatey 在 Windows 上安装
- 安装 Chocolatey
- 运行
choco install fselect
通过 Scoop 在 Windows 上安装
- 安装 Scoop
- 运行
scoop install fselect
macOS
预编译二进制文件可在 GitHub 下载页面获取(gunzip,然后 chmod +x fselect):
通过 Homebrew 在 Mac 上安装
- 安装 brew
- 运行
brew install fselect
通过 MacPorts 在 Mac 上安装
- 安装 MacPorts
- 运行:
sudo port selfupdate sudo port install fselect
用法
fselect [ARGS] COLUMN[, COLUMN...] [from ROOT[, ROOT...]] [where EXPR] [group by COLUMNS] [order by COLUMNS] [limit N] [offset N] [into FORMAT]
交互模式
fselect -i
文档
示例
查找临时文件或配置文件(完整路径和大小):
fselect size, path from /home/user where name = '*.cfg' or name = '*.tmp'
Windows 用户可以省略引号:
fselect size, path from C:\Users\user where name = *.cfg or name = *.tmp
或者将所有参数放在引号中,例如:
fselect "name from /home/user/tmp where size > 0"
在带空格的目录名中搜索(也支持反引号):
fselect "name from '/home/user/dir with spaces' where size > 0"
fselect "name from `/home/user/dir with spaces` where size > 0"
或者简单地转义单引号:
fselect name from \'/home/user/dir with spaces\' where size gt 0
指定文件大小,获取绝对路径并加入结果:
cd /home/user
fselect size, abspath from ./tmp where size gt 2g
fselect fsize, abspath from ./tmp where size = 5m
fselect hsize, abspath from ./tmp where size lt 8k
fselect name, size from ./tmp where size between 5mb and 6mb
更复杂的查询:
fselect "name from /tmp where (name = *.tmp and size = 0) or (name = *.cfg and size > 1000000)"
可以使用子查询:
fselect "name from /test1 where size > 100 and size in (select size from /test2 where name in (select name from /test3 where modified in (select modified from /test4 where size < 200)))"
fselect "name, path, size from /data as data where exists (select * from /backup as backup where backup.name = data.name)"
子查询也可用于 FROM 子句,作为外层查询的数据源:
fselect "src.name, src.size from (select path from /projects depth 2 where size > 100) as src where src.name like '%.rs'"
聚合函数(可按需使用花括号,甚至可与普通圆括号组合使用):
fselect "MIN(size), MAX{size}, AVG(size), SUM{size}, COUNT(*) from /home/user/Downloads"
格式化函数:
fselect "LOWER(name), UPPER(name), LENGTH(name), YEAR(modified) from /home/user/Downloads"
获取最旧文件的年份:
fselect "MIN(YEAR(modified)) from /home/user"
如需处理带空格的文件名,请使用单引号:
fselect "path from '/home/user/Misc stuff' where name != 'Some file'"
支持 Rust 风格 的正则表达式:
fselect name from /home/user where path =~ '.*Rust.*'
否定正则表达式:
fselect "name from . where path !=~ '^\./config'"
简单 glob 会自动展开,可与 = 和 != 运算符配合使用:
fselect name from /home/user where path = '*Rust*'
经典 LIKE:
fselect "path from /home/user where name like '%report-2018-__-__???'"
精确匹配运算符,可在禁用正则表达式的情况下搜索:
fselect "path from /home/user where name === 'some_*_weird_*_name'"
按日期查找文件:
fselect path from /home/user where created = 2017-05-01
fselect path from /home/user where modified = today
fselect path from /home/user where accessed = yesterday
fselect "path from /home/user where modified = 'apr 1'"
fselect "path from /home/user where modified = 'last fri'"
更精确地匹配在下午 3 点至 4 点之间创建的所有文件:
fselect path from /home/user where created = '2017-05-01 15'
还可以更精确:
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'
支持日期和时间区间(查找自 5 月 1 日以来更新的所有内容):
fselect path from /home/user where modified gte 2017-05-01
默认为当前目录:
fselect path, size where name = '*.jpg'
在多个位置中搜索:
fselect path from /home/user/oldstuff, /home/user/newstuff where name = '*.jpg'
可指定最小和/或最大深度(depth 是 maxdepth 的同义词):
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'
可选择跟随符号链接(symlinks):
fselect path, size from /home/user symlinks where name = '*.jpg'
在压缩包内搜索(目前仅支持 zip 压缩包):
fselect path, size from /home/user archives where name = '*.jpg'
或组合使用:
fselect size, path from /home/user depth 5 archives symlinks where name = '*.jpg' limit 100
启用 .gitignore 或 .hgignore 支持:
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'
按图像尺寸搜索:
fselect CONCAT(width, 'x', height), path from /home/user/photos where width gte 2000 or height gte 2000
查找正方形图像:
fselect path from /home/user/Photos where width = height
查找名称部分已知但扩展名未知的图像:
fselect path from /home/user/projects where name = "*RDS*" and width gte 1
查找老派说唱(old-school rap)MP3 文件:
fselect duration, path from /home/user/music where genre = Rap and bitrate = 320 and mp3_year lt 2000
常用文件扩展名的快捷方式:
fselect path from /home/user where is_archive = true
fselect path, mime from /home/user where is_audio = 1
fselect path, mime from /home/user where is_book != false
使用布尔列的更简便方式:
fselect path from /home/user where is_doc
fselect path from /home/user where is_image
fselect path from /home/user where is_video
查找具有危险权限的文件:
fselect mode, path from /home/user where other_write or other_exec
fselect mode, path from /home/user where other_all
在文件 mode 中可使用简单的类 glob 表达式,甚至正则表达式:
fselect mode, path from /home/user where mode = '*rwx'
fselect mode, path from /home/user where mode =~ '.*rwx$'
按所有者的 uid 或 gid 查找文件:
fselect uid, gid, path from /home/user where uid != 1000 or gid != 1000
或按所有者或组的名称:
fselect user, group, path from /home/user where user = mike or group = mike
查找特殊文件:
fselect name from /usr/bin where suid
fselect path from /tmp where is_sticky
fselect path from /tmp where is_pipe
fselect path from /tmp where is_socket
查找带有扩展属性(xattrs)的文件,检查特定 xattr 是否存在,或获取其值:
fselect "path, has_xattrs, has_xattr(user.test), xattr(user.test) from /home/user"
将任意文本作为列包含:
fselect "name, ' has size of ', size, ' bytes'"
对结果分组:
fselect "ext, count(*) from /tmp group by ext"
fselect "ext, count(*) from /tmp group by 1"
fselect "mime, ext, count(*) from /tmp group by 1, 2"
对结果排序:
fselect path from /tmp order by size desc, name
fselect modified, fsize, path from ~ order by 1 desc, 3
最后,限制结果数量:
fselect name from /home/user/samples limit 5
格式化输出:
fselect size, path from /home/user limit 5 into json
fselect size, path from /home/user limit 5 into csv
fselect size, path from /home/user limit 5 into html
License
MIT/Apache-2.0
由 JetBrains IDEA open source license