运维当中查找文件是日常开发和系统管理中非常常见的任务。传统的 find
和 ls
命令功能强大,但语法相对复杂,尤其对于初学者来说,学习成本还是比较大的。而 fselect
是一个更加强大的文件查找工具,它参考了 SQL 的语法风格,可以让用户可以用类似数据库查询的方式在文件系统中进行搜索。今天给大家分享一下关于fselect的相关知识,感兴趣的朋友可以看一看!
fselect
是一个开源命令行工具,允许你使用类似 SQL 的语法来高效查找文件。当然它并不是要完全取代 find
或 ls
传统命令行工具,而是给运维人员提供了一种更直观、更高效的方式来完成文件搜索任务。
fselect语法采用了高度宽松的类 SQL 风格,有sql语法经验的朋友直接可以上手,针对小白也可以快速上手。
官网:https://github.com/jhspetersson/fselect
SELECT column_list
FROM path
[WHERE condition]
[GROUP BY column]
[ORDER BY column [ASC|DESC]]
[LIMIT n]
格式说明:
SELECT column_list:指定要显示的文件属性(列)。常用的文件属性如下:
name
:文件名path
:完整路径size
:文件大小(支持 KB、MB、GB 单位)mtime
/ atime
/ ctime
:修改时间 / 访问时间 / 创建时间extension
:扩展名mime
:MIME 类型width
/ height
:图像宽高(仅图片)artist
/ title
:MP3 元数据hash
:文件哈希值(如 MD5)from path:要检索的文件目录。/home/user
指定绝对路径;默认为当前目录。
where condition:设置过滤条件 可选。示例:
WHERE size > 20M -- 文件大于20M
WHERE mtime > '2025-08-06' -- 文件修改时间大于2025-08-06
WHERE name =~ '\.log$' -- 筛选文件名以 .log 结尾的文件
WHERE extension = 'jpg' AND width > 1920 --后缀名为jpg并且 图片宽度大于1920
WHERE mime LIKE 'text%' -- MIME 类型为text
GROUP BY column:按某一字段分组,常用于统计,比如常见的是根据文件后缀名统计数量 可选。
ORDER BY column [ASC|DESC]:根据字段进行排序。可选。
ORDER BY size DESC -- 根据文件大小降序
ORDER BY mtime ASC -- 根据文件修改时间升序
LIMIT n :限制返回搜索文件结果的数量,可选。
列名(Column) | 含义(Meaning) | 说明(Comment) |
---|---|---|
name | 返回文件的名称(包含扩展名) | 例如:document.pdf |
extension 或 ext | 返回文件的扩展名 | 例如:pdf、jpg、txt |
path | 返回文件的相对路径 | 相对于当前目录或查询起点 |
abspath | 返回文件的绝对路径 | 完整路径,如 /home/user/file.txt |
directory 或 dirname 或 dir | 返回文件所在的目录路径(相对) | 不包含文件名 |
absdir | 返回文件所在目录的绝对路径 | 完整目录路径 |
size | 返回文件大小(以字节为单位) | 整数,如 1024 表示 1KB |
fsize 或 hsize | 返回带单位的文件大小 | 格式化输出,如 1.2K、3.5M、2.1G |
uid | 返回文件所有者的用户 ID | 数值型 UID,如 1000 |
gid | 返回文件所属组的组 ID | 数值型 GID,如 100 |
accessed | 返回文件最后访问时间 | 格式:YYYY-MM-DD HH:MM:SS |
created | 返回文件创建时间 | 格式:YYYY-MM-DD HH:MM:SS(部分系统如 Windows 支持较好) |
modified | 返回文件最后修改时间 | 格式:YYYY-MM-DD HH:MM:SS |
is_dir | 布尔值,表示该路径是否为目录 | true / false |
is_file | 布尔值,表示该路径是否为普通文件 | true / false |
is_symlink | 布尔值,表示该路径是否为符号链接 | true / false |
is_pipe 或 is_fifo | 布尔值,表示是否为 FIFO 管道文件 | 常见于 Unix/Linux 系统 |
is_char 或 is_character | 布尔值,表示是否为字符设备文件 | 如 /dev/tty |
is_block | 布尔值,表示是否为块设备文件 | 如 /dev/sda |
is_socket | 布尔值,表示是否为套接字文件 | 如 Unix domain socket |
is_hidden | 布尔值,表示文件是否为隐藏文件 | 例如 Linux 下以 . 开头的文件 |
has_xattrs | 布尔值,表示文件是否有扩展属性 | 如 user.comment 等元数据 |
capabilities 或 caps | 返回描述 Linux 能力(capabilities)的字符串 | 仅 Linux 支持,如 cap_net_bind_service+ep |
device | 返回文件所在设备的设备编号 | 仅 Linux 支持,用于区分不同存储设备 |
inode | 返回文件的 inode 编号 | 仅 Linux/Unix 支持,唯一标识文件 |
blocks | 返回文件占用的数据块数量(每块 256 字节) | 仅 Linux 支持 |
hardlinks | 返回文件的硬链接数量 | 仅 Linux/Unix 支持 |
mode | 返回文件权限(类似 ls -la 的第一列) | 如 drwxr-xr-x 或 -rwxr--r-- |
user | 返回文件所有者的用户名 | 仅在支持用户系统的平台(如 *nix)启用时可用 |
user_read | 布尔值,表示所有者是否可读 | 权限位检查 |
user_write | 布尔值,表示所有者是否可写 | 权限位检查 |
user_exec | 布尔值,表示所有者是否可执行 | 权限位检查 |
user_all | 布尔值,表示所有者是否拥有全部权限(rwx) | 相当于 user_read and user_write and user_exec |
group | 返回文件所属组的组名 | 仅在支持用户系统的平台启用时可用 |
group_read | 布尔值,表示所属组是否可读 | 权限位检查 |
group_write | 布尔值,表示所属组是否可写 | 权限位检查 |
group_exec | 布尔值,表示所属组是否可执行 | 权限位检查 |
group_all | 布尔值,表示所属组是否拥有全部权限(rwx) | 相当于 group_read and group_write and group_exec |
other_read | 布尔值,表示其他用户是否可读 | 权限位检查 |
other_write | 布尔值,表示其他用户是否可写 | 权限位检查 |
other_exec | 布尔值,表示其他用户是否可执行 | 权限位检查 |
other_all | 布尔值,表示其他用户是否拥有全部权限(rwx) | 相当于 other_read and other_write and other_exec |
suid | 布尔值,表示文件是否设置了 SUID 位 | 执行时以所有者身份运行 |
sgid | 布尔值,表示文件是否设置了 SGID 位 | 执行时以组身份运行,或目录继承组 |
width | 返回图像或 MP4 视频的宽度(像素) | 依赖图像解析库 |
height | 返回图像或 MP4 视频的高度(像素) | 依赖图像解析库 |
mime | 返回文件的 MIME 类型 | 如 image/jpeg、text/plain、application/pdf |
is_binary | 布尔值,表示文件内容是否为二进制 | 基于内容分析 |
is_text | 布尔值,表示文件内容是否为文本 | 与 is_binary 互斥 |
line_count | 返回文本文件的行数 | 仅对文本文件有效 |
exif_datetime | 返回照片拍摄的日期和时间 | 来自 EXIF 元数据 |
exif_altitude 或 exif_alt | 返回照片拍摄时的 GPS 海拔高度 | 来自 EXIF |
exif_latitude 或 exif_lat | 返回照片拍摄时的 GPS 纬度 | 来自 EXIF |
exif_longitude 或 exif_lng 或 exif_lon | 返回照片拍摄时的 GPS 经度 | 来自 EXIF |
exif_make | 返回相机制造商名称 | 如 Canon、Sony |
exif_model | 返回相机型号 | 如 Canon EOS 5D Mark IV |
exif_software | 返回拍摄或编辑照片所用的软件 | 如 Adobe Photoshop |
exif_version | 返回 EXIF 元数据版本 | 如 2.3 |
exif_exposure_time 或 exif_exptime | 返回曝光时间 | 如 1/250 秒 |
exif_aperture | 返回光圈值 | 如 f/2.8 |
exif_shutter_speed | 返回快门速度 | 如 1/125 |
exif_f_number 或 exif_f_num | 返回 F 值 | 与光圈相关 |
exif_iso_speed 或 exif_iso | 返回 ISO 感光度 | 如 800、1600 |
exif_focal_length 或 exif_focal_len | 返回焦距 | 如 50mm |
exif_lens_make | 返回镜头制造商 | 如 Tamron |
exif_lens_model | 返回镜头型号 | 如 24-70mm f/2.8 |
mp3_title 或 title | 返回音频文件的标题 | 来自 ID3 等元数据 |
mp3_album 或 album | 返回音频文件的专辑名 | 来自元数据 |
mp3_artist 或 artist | 返回音频文件的艺术家 | 来自元数据 |
mp3_genre 或 genre | 返回音频文件的流派 | 如 Rock、Jazz |
mp3_year | 返回音频文件的年份 | 来自元数据 |
mp3_freq 或 freq | 返回音频或视频的采样率 | 单位:Hz,如 44100 |
mp3_bitrate 或 bitrate | 返回音频文件的比特率 | 单位:kbps,如 320 |
duration | 返回音频文件的播放时长 | 单位:秒 |
is_shebang | 布尔值,表示文件是否以 #! 开头 | 常用于脚本文件识别 |
is_empty | 布尔值,表示文件是否为空(大小为0)或目录为空 | 通用判断 |
is_archive | 布尔值,表示是否为归档文件 | 默认支持 .zip, .tar, .gz 等 |
is_audio | 布尔值,表示是否为音频文件 | 默认支持 .mp3, .wav, .flac 等 |
is_book | 布尔值,表示是否为电子书文件 | 默认支持 .epub, .mobi, .pdf 等 |
is_doc | 布尔值,表示是否为文档文件 | 默认支持 .doc, .pdf, .txt, .odt 等 |
is_font | 布尔值,表示是否为字体文件 | 默认支持 .ttf, .otf, .woff 等 |
is_image | 布尔值,表示是否为图像文件 | 默认支持 .jpg, .png, .gif, .webp 等 |
is_source | 布尔值,表示是否为源代码文件 | 默认支持 .c, .py, .js, .go 等 |
is_video | 布尔值,表示是否为视频文件 | 默认支持 .mp4, .avi, .mkv, .mov 等 |
sha1 | 返回文件的 SHA-1 哈希值 | 40 位十六进制字符串 |
sha2_256 或 sha256 | 返回文件的 SHA-256 哈希值 | 64 位十六进制字符串 |
sha2_512 或 sha512 | 返回文件的 SHA-512 哈希值 | 128 位十六进制字符串 |
sha3_512 或 sha3 | 返回文件的 SHA3-512 哈希值 | 128 位十六进制字符串 |
该表格适用于 fselect
的主流版本(v0.9+)。
采用类 SQL 语法,使用 SELECT、FROM、WHERE 等关键字构建查询,语法宽松、结构清晰,易于理解和记忆,让文件搜索像操作数据库一样直观。
支持构建包含多个条件的复杂查询,并具备有限的子查询功能,可满足更精细的文件筛选需求。
内置丰富的函数支持,包括聚合函数(如 count、sum、avg)、日期函数、数学函数等,可用于文件统计与条件过滤。
能够搜索压缩归档文件(如 tar、zip)内部的内容,无需手动解压即可定位目标文件。
实验性支持读取并遵循项目中的 .gitignore、.hgignore 和 .dockerignore 文件规则,自动跳过被忽略的路径和文件。
支持根据图像的宽度、高度以及 EXIF 元数据(如拍摄时间、设备型号)进行搜索,适用于多媒体文件管理。
可读取并基于 MP3 文件的 ID3 标签信息(如歌名、艺术家、专辑)进行查询,方便音乐文件整理。
支持根据文件的扩展属性(extended attributes)和 Linux capabilities 进行查找,适用于高级系统管理场景。
支持通过计算文件的哈希值(如 MD5、SHA1)进行匹配搜索,可用于查找重复文件或验证文件完整性。
可根据文件的 MIME 类型(如 image/jpeg、text/plain)进行分类和筛选,提升搜索准确性。
提供常见文件类型的快捷方式(如图片、视频、文档、代码等),简化查询语句编写。
支持交互式模式,用户可在交互环境中逐步输入和调试查询命令,提升使用体验。
支持多种输出格式,包括标准文本、CSV、JSON、HTML 等,便于与其他工具集成或进行数据导出。
Windows环境下推荐使用scoop方式来安装最简单直接,首先确保安装scoop工具,然后直接打开powershell输入如下命令:
scoop install fselect
目前安装的当前最新版本是0.9.0。安装成功之后效果如下图:
首先D盘创建一个Test文件夹存放如下文件:
查询全部文件
fselect * from D:\Test
查询文件名和文件大小
fselect name,size from D:\Test
分组统计每种文件类型的文件数量
fselect "extension, count(*) from D:\Test group by extension order by count(*) desc"
查询后缀名为jpg并且高度大于4000的图片
fselect name,width,height from D:\Test where extension=jpg and width>4000
三种格式化输出
fselect name,size, path from D:\Test limit 5 into json
fselect name,size, path from D:\Test limit 5 into csv
fselect name,size, path from D:\Test limit 5 into html
以上是关于fselect命令行工具的介绍,该工具非常适合IT运维人员和程序员等办公人员进行文件的高效检索。大家如果使用过程中有啥问题的话,欢迎评论区聊一聊!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。