You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本实现删除目录中非当前内核版本的.deb文件

原脚本错误原因

原脚本几个核心语法错误直接导致全量误删:

  • 版本获取语法错误:version='uname -r'用单引号包裹命令,只会把uname -r当成普通字符串赋值给变量,不会执行命令取内核版本;后续单独写$version更是会尝试把版本字符串当成命令执行,完全无效
  • 路径逻辑错误:执行ls前没有切换到~/Installed-kernels目录,实际列的是脚本运行时所在目录的文件
  • 匹配规则错误:grep -v '$version*'用单引号包裹匹配串,shell不会解析里面的$version变量,会直接匹配字面量$version*,自然匹配不到任何文件,反向匹配后就会把所有文件传给rm删除
  • 没有做文件类型过滤,会误碰目录内非.deb格式的文件
  • 管道组合没有做异常兜底,当匹配结果为空时容易触发误删
正确可用脚本
#!/bin/bash
# 获取当前正在运行的内核完整版本号
running_kernel=$(uname -r)
# 定义deb包存放目录
target_dir=~/Installed-kernels

# 切换到目标目录,切换失败直接退出脚本,避免在错误目录执行删除
cd "$target_dir" || exit 1

# 仅遍历目录下所有.deb后缀文件
for deb_pkg in *.deb; do
    # 兜底:如果目录下没有deb文件,直接跳过,避免把*.deb当成文件名处理
    [ -e "$deb_pkg" ] || continue
    # 文件名不包含当前运行内核版本串的,执行删除
    if [[ ! "$deb_pkg" == *"$running_kernel"* ]]; then
        rm -f "$deb_pkg"
    fi
done
使用说明
  • 脚本通过$(uname -r)直接取当前运行内核的完整版本字符串,和自定义编译生成的deb包内的版本标识完全匹配,示例中的三个5.18.8版本deb包只要是当前运行内核对应的,都会被完整保留
  • 首次使用建议先把脚本内的rm -f "$deb_pkg"替换为echo "待删除: $deb_pkg",执行后确认待删除文件列表完全符合预期,再改回删除命令,避免误删
  • 脚本仅处理.deb后缀文件,不会改动目录下其他格式的内容
  • 用shell原生字符串匹配代替ls+grep+xargs的管道写法,兼容带空格、特殊字符的文件名,不会出现变量不解析的问题

内容的提问来源于stack exchange,提问作者user2049184

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:30:57