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
相关产品推荐
相关产品推荐

