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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

  • 在 Linux 桌面日常使用中,文件搜索是高频需求。系统自带的文件管理器搜索往往范围受限、速度慢,而经典的find命令虽然功能强大,但纯命令行的操作方式对普通用户不够友好,记忆成本高。第三方图形化搜索工具大多体积较大,部分需要建立索引,配置繁琐。

  • 本文基于纯 Bash 脚本 + 系统原生 Zenity 组件实现了一款轻量图形化全局文件搜索工具,无 Python/Qt 等重型依赖,单脚本即可运行。经过多轮迭代修复了匹配逻辑、类型筛选、参数转义等核心问题,最终版本可稳定实现全目录模糊搜索,同时配套桌面快捷方式,双击即用。

最重要的本工具针对没有什么电脑基础的体制内人员,可以快速上手按照,并使用。

二、功能特性

  1. 默认模糊包含匹配

    输入关键词自动前后匹配通配符,无需手动加*,符合日常使用直觉。比如输入log,即可匹配所有文件名包含log的内容,且不区分大小写。

  2. 精准类型筛选

    支持三档筛选:文件和文件夹、仅文件、仅文件夹。彻底解决了前期版本「仅文件搜不到结果、默认只列出文件夹」的 bug。

  3. 全目录自由遍历

    默认从根目录/全局扫描,也可自定义指定搜索目录;自动静默权限不足报错,不中断搜索流程。

  4. 实时进度反馈

    后台执行搜索,前台显示脉冲进度条,实时刷新已找到的结果数量;支持中途取消搜索,自动清理后台进程。

  5. 结果快捷操作

    支持三种常用操作:直接打开文件 / 文件夹、打开所在上级目录、复制完整路径,适配所有桌面环境。

  6. 全场景路径兼容

    完美处理含空格、中文、特殊字符的文件路径,不会出现路径拆分、打开失败的问题。

三、完整代码实现

(一)依赖安装

  • 绝大多数桌面发行版已默认预装 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 等其他桌面:赋予权限后直接双击,弹出安全提示时选择**「信任并执行」**即可

五、使用指南

在这里插入图片描述

(一)基础操作流程

  1. 双击桌面图标启动工具
  2. 输入搜索关键词(默认模糊匹配,无需加通配符)
  3. 可选:填写指定搜索目录,缩小范围提升速度
  4. 选择搜索类型与匹配模式
  5. 点击「开始搜索」,等待进度完成
  6. 在结果列表中选中目标,选择对应操作即可

(二)三种匹配模式详解

匹配模式 适用场景 使用示例
模糊包含匹配 日常快速搜索,记不清完整文件名 输入config,匹配myconfig.confConfig目录等所有含 config 的内容
通配符匹配 精确后缀、前缀、格式筛选 输入*.sh匹配所有 Shell 脚本;输入test*匹配 test 开头的文件
正则匹配 复杂规则筛选 输入 `.*.(jpg png)$` 匹配所有 jpg/png 格式图片

(三)搜索效率优化技巧

  • 全局根目录搜索包含/proc/sys等虚拟文件系统,耗时较长;若知道文件大致范围,建议指定目录(如/home/用户名),搜索速度会大幅提升

  • 结果超过 5000 条会二次确认加载,避免界面卡顿

  • 日常使用普通权限版本即可,仅当需要搜索系统目录时使用管理员版本

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐