办公提效:适配麒麟 / 统信的全局文件搜索工具 兼容全 Linux 系统
办公提效:适配麒麟 / 统信的全局文件搜索工具 兼容全 Linux 系统

一、纯 Shell 打造 Linux 轻量图形化全局文件搜索工具 | 最终稳定版落地实践


-
在 Linux 桌面日常使用中,文件搜索是高频需求。系统自带的文件管理器搜索往往范围受限、速度慢,而经典的
find命令虽然功能强大,但纯命令行的操作方式对普通用户不够友好,记忆成本高。第三方图形化搜索工具大多体积较大,部分需要建立索引,配置繁琐。 -
本文基于纯 Bash 脚本 + 系统原生 Zenity 组件实现了一款轻量图形化全局文件搜索工具,无 Python/Qt 等重型依赖,单脚本即可运行。经过多轮迭代修复了匹配逻辑、类型筛选、参数转义等核心问题,最终版本可稳定实现全目录模糊搜索,同时配套桌面快捷方式,双击即用。
最重要的本工具针对没有什么电脑基础的体制内人员,可以快速上手按照,并使用。
二、功能特性
-
默认模糊包含匹配
输入关键词自动前后匹配通配符,无需手动加
*,符合日常使用直觉。比如输入log,即可匹配所有文件名包含log的内容,且不区分大小写。 -
精准类型筛选
支持三档筛选:文件和文件夹、仅文件、仅文件夹。彻底解决了前期版本「仅文件搜不到结果、默认只列出文件夹」的 bug。
-
全目录自由遍历
默认从根目录
/全局扫描,也可自定义指定搜索目录;自动静默权限不足报错,不中断搜索流程。 -
实时进度反馈
后台执行搜索,前台显示脉冲进度条,实时刷新已找到的结果数量;支持中途取消搜索,自动清理后台进程。
-
结果快捷操作
支持三种常用操作:直接打开文件 / 文件夹、打开所在上级目录、复制完整路径,适配所有桌面环境。
-
全场景路径兼容
完美处理含空格、中文、特殊字符的文件路径,不会出现路径拆分、打开失败的问题。
三、完整代码实现
(一)依赖安装
- 绝大多数桌面发行版已默认预装 Zenity,缺失可执行对应命令安装:
# Debian / Ubuntu / 麒麟 / 深度等Debian系
sudo apt install zenity -y
# CentOS / RHEL / Fedora
sudo yum install zenity -y
(二)主程序完整代码
- 将以下代码保存为
s.sh,放置于/home/file_search/目录下:
#!/bin/bash
# Linux 图形化全局文件搜索工具(最终修复版)
# 修复:默认模糊包含匹配、文件搜不到、类型筛选失效问题
# 临时结果文件,退出自动清理
TEMP_RESULT=$(mktemp /tmp/file_search_final_XXXXXX.txt)
trap "rm -f $TEMP_RESULT" EXIT
# ====================== 1. 搜索条件表单 ======================
FORM_RESULT=$(zenity --forms --title="全局文件搜索工具" \
--text="输入关键词,默认模糊匹配(包含关键词即可)" \
--width=520 \
--add-entry="搜索关键词(例如:config、log)" \
--add-entry="搜索目录(留空=全局搜索 /)" \
--add-combo="搜索类型" --combo-values="文件和文件夹|仅文件|仅文件夹" \
--add-combo="匹配模式" --combo-values="模糊包含匹配|通配符匹配|正则匹配" \
--ok-label="开始搜索" --cancel-label="取消")
if [ $? -ne 0 ]; then
exit 0
fi
# 解析输入
PATTERN=$(echo "$FORM_RESULT" | cut -d'|' -f1)
ROOT_DIR=$(echo "$FORM_RESULT" | cut -d'|' -f2)
FILE_TYPE=$(echo "$FORM_RESULT" | cut -d'|' -f3)
MATCH_MODE=$(echo "$FORM_RESULT" | cut -d'|' -f4)
# 空关键词校验
if [ -z "$PATTERN" ]; then
zenity --error --text="错误:搜索关键词不能为空" --width=320
exit 1
fi
# 默认全局搜索
if [ -z "$ROOT_DIR" ]; then
ROOT_DIR="/"
fi
if [ ! -d "$ROOT_DIR" ]; then
zenity --error --text="错误:搜索目录不存在" --width=320
exit 1
fi
# ====================== 2. 构建 find 命令参数(数组方式,零转义问题) ======================
FIND_ARGS=()
# ① 类型过滤
case "$FILE_TYPE" in
"仅文件")
FIND_ARGS+=("-type" "f")
;;
"仅文件夹")
FIND_ARGS+=("-type" "d")
;;
*)
# 文件+文件夹,不加 type 限制
;;
esac
# ② 匹配模式处理(核心修复:默认自动模糊包含)
case "$MATCH_MODE" in
"通配符匹配")
# 用户自己写通配符,原样传递,区分大小写
FIND_ARGS+=("-name" "$PATTERN")
;;
"正则匹配")
FIND_ARGS+=("-regex" ".*${PATTERN}.*")
;;
*)
# 默认:模糊包含匹配,不区分大小写,自动前后加 *
FIND_ARGS+=("-iname" "*${PATTERN}*")
;;
esac
# ====================== 3. 执行搜索 + 实时进度 ======================
# 纯数组执行,彻底避免引号/转义问题
find "$ROOT_DIR" "${FIND_ARGS[@]}" -print 2>/dev/null > "$TEMP_RESULT" &
FIND_PID=$!
# 进度弹窗
(
while kill -0 "$FIND_PID" 2>/dev/null; do
COUNT=$(wc -l < "$TEMP_RESULT" 2>/dev/null || echo 0)
echo "# 正在搜索... 已找到 $COUNT 个结果\n全局搜索包含系统目录,耗时可能较长"
sleep 0.2
done
echo "100"
FINAL_COUNT=$(wc -l < "$TEMP_RESULT")
echo "# 搜索完成,共找到 $FINAL_COUNT 个结果"
) | zenity --progress \
--title="搜索进行中" \
--text="正在扫描文件系统..." \
--pulsate \
--auto-close \
--width=450
# 用户取消则终止搜索
if [ $? -ne 0 ]; then
kill "$FIND_PID" 2>/dev/null
wait "$FIND_PID" 2>/dev/null
exit 0
fi
# ====================== 4. 结果展示 ======================
RESULT_COUNT=$(wc -l < "$TEMP_RESULT")
if [ "$RESULT_COUNT" -eq 0 ]; then
zenity --info --text="未找到匹配的文件或文件夹" --width=320
exit 0
fi
# 结果过多提示
if [ "$RESULT_COUNT" -gt 5000 ]; then
zenity --question \
--text="搜索结果共 $RESULT_COUNT 条,全部加载可能较慢。\n是否继续显示全部结果?" \
--width=380
if [ $? -ne 0 ]; then
exit 0
fi
fi
# 读取结果到数组(兼容空格、特殊字符)
mapfile -t RESULT_ARRAY < "$TEMP_RESULT"
LIST_ITEMS=()
for item in "${RESULT_ARRAY[@]}"; do
LIST_ITEMS+=("$item")
done
# 结果列表弹窗
SELECTED_PATH=$(zenity --list \
--title="搜索结果 - 共 $RESULT_COUNT 条" \
--text="选中后点击确定,可选择打开方式" \
--width=820 --height=560 \
--column="文件/文件夹路径" \
"${LIST_ITEMS[@]}")
if [ $? -ne 0 ] || [ -z "$SELECTED_PATH" ]; then
exit 0
fi
# ====================== 5. 选中项操作 ======================
ACTION=$(zenity --list --radiolist \
--title="操作选择" \
--text="请选择对选中项的操作" \
--width=380 \
--column="选择" --column="操作" \
TRUE "打开文件/文件夹" \
FALSE "打开所在目录" \
FALSE "复制完整路径")
case "$ACTION" in
"打开文件/文件夹")
xdg-open "$SELECTED_PATH" 2>/dev/null
;;
"打开所在目录")
xdg-open "$(dirname "$SELECTED_PATH")" 2>/dev/null
;;
"复制完整路径")
if command -v xclip &>/dev/null; then
echo -n "$SELECTED_PATH" | xclip -selection clipboard
zenity --info --text="路径已复制到剪贴板" --width=280
elif command -v xsel &>/dev/null; then
echo -n "$SELECTED_PATH" | xsel -b
zenity --info --text="路径已复制到剪贴板" --width=280
else
zenity --info --text="路径:\n$SELECTED_PATH\n\n(未检测到xclip/xsel,请手动复制)" --width=420
fi
;;
esac
exit 0
四、一键部署:桌面快捷方式配置
- 为了方便日常使用,我们可以通过标准
.desktop格式创建桌面快捷方式,实现双击启动,和系统原生软件体验一致。
(一)一键创建快捷方式脚本
保存以下脚本为icon.sh,执行即可自动生成桌面图标:
#!/bin/bash
# 一键创建桌面快捷方式 - 适配路径 /home/file_search/s.sh
# ========== 配置项 ==========
# 你的脚本绝对路径
SCRIPT_PATH="/home/file_search/s.sh"
# 快捷方式名称
SHORTCUT_NAME="全局文件搜索"
# 系统图标名(可替换为自定义图片绝对路径)
ICON_NAME="system-search"
# ============================
# 1. 检查原脚本是否存在
if [ ! -f "$SCRIPT_PATH" ]; then
echo "错误:未找到脚本文件 $SCRIPT_PATH"
exit 1
fi
# 2. 确保原脚本有执行权限
chmod +x "$SCRIPT_PATH"
echo "已为原脚本添加执行权限"
# 3. 自动获取系统桌面目录(兼容中英文)
DESKTOP_DIR=$(xdg-user-dir DESKTOP 2>/dev/null)
if [ -z "$DESKTOP_DIR" ] || [ ! -d "$DESKTOP_DIR" ]; then
DESKTOP_DIR="$HOME/Desktop"
fi
echo "桌面目录:$DESKTOP_DIR"
# 4. 生成 .desktop 快捷方式文件
SHORTCUT_FILE="$DESKTOP_DIR/${SHORTCUT_NAME}.desktop"
cat > "$SHORTCUT_FILE" << EOF
[Desktop Entry]
Type=Application
Name=${SHORTCUT_NAME}
Comment=图形化全盘文件搜索工具
Exec=${SCRIPT_PATH}
Icon=${ICON_NAME}
Terminal=false
Categories=Utility;Filesystem;
EOF
# 5. 赋予快捷方式执行权限
chmod +x "$SHORTCUT_FILE"
echo "桌面快捷方式已创建:$SHORTCUT_FILE"
# 6. 可选:同步添加到系统开始菜单
read -p "是否同时添加到系统开始菜单?(y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
APP_DIR="$HOME/.local/share/applications"
mkdir -p "$APP_DIR"
cp "$SHORTCUT_FILE" "$APP_DIR/"
echo "已添加到系统开始菜单,可在应用列表搜索「${SHORTCUT_NAME}」启动"
fi
echo ""
echo "创建完成!"
echo "👉 回到桌面,右键点击「${SHORTCUT_NAME}」图标,选择「允许启动」即可双击运行"

- 执行命令:
chmod +x icon.sh
./icon.sh
(二)桌面图标启用说明
- GNOME/Ubuntu 默认桌面:右键点击桌面图标 → 选择**「允许启动 / Allow Launching」**,图标变为正常程序样式后即可双击运行
- KDE/XFCE 等其他桌面:赋予权限后直接双击,弹出安全提示时选择**「信任并执行」**即可
五、使用指南

(一)基础操作流程
- 双击桌面图标启动工具
- 输入搜索关键词(默认模糊匹配,无需加通配符)
- 可选:填写指定搜索目录,缩小范围提升速度
- 选择搜索类型与匹配模式
- 点击「开始搜索」,等待进度完成
- 在结果列表中选中目标,选择对应操作即可
(二)三种匹配模式详解
| 匹配模式 | 适用场景 | 使用示例 | |
|---|---|---|---|
| 模糊包含匹配 | 日常快速搜索,记不清完整文件名 | 输入config,匹配myconfig.conf、Config目录等所有含 config 的内容 |
|
| 通配符匹配 | 精确后缀、前缀、格式筛选 | 输入*.sh匹配所有 Shell 脚本;输入test*匹配 test 开头的文件 |
|
| 正则匹配 | 复杂规则筛选 | 输入 `.*.(jpg | png)$` 匹配所有 jpg/png 格式图片 |
(三)搜索效率优化技巧
-
全局根目录搜索包含
/proc、/sys等虚拟文件系统,耗时较长;若知道文件大致范围,建议指定目录(如/home/用户名),搜索速度会大幅提升 -
结果超过 5000 条会二次确认加载,避免界面卡顿
-
日常使用普通权限版本即可,仅当需要搜索系统目录时使用管理员版本
更多推荐




所有评论(0)