当前位置: 首页 > news >正文

dlc — Docker Log Cleaner(支持名称、ID前缀、交互序号清理,模糊匹配交互确认)

安装脚本:

curl -L -o /usr/local/bin/dlc https://files-cdn.cnblogs.com/files/nihaorz/dlc.sh && chmod +x /usr/local/bin/dlc && dlc -h

 

脚本源码:

#!/bin/bash
stty erase ^H 2>/dev/null
# dlc — Docker Log Cleaner(支持名称、ID前缀、交互序号清理,模糊匹配交互确认)docker_root=$(docker info --format '{{.DockerRootDir}}' 2>/dev/null)
interactive_mode_flag=0
resolved_matches=()# 清理指定容器日志
clean_logs() {local cid="$1"local silent="${2:-0}"local cnamecname=$(docker ps -a --filter id="$cid" --format '{{.Names}}' 2>/dev/null)local log_dir="$docker_root/containers/$cid"local log_file="$log_dir/${cid}-json.log"if [ -d "$log_dir" ]; thenif [ -f "$log_file" ]; thentruncate -s 0 "$log_file" 2>/dev/null || echo -n > "$log_file"fifind "$log_dir" -type f -name "${cid}-json.log*" ! -name "${cid}-json.log" -exec rm -f {} +[ "$silent" -ne 1 ] && echo "✅ 容器 $cname (${cid:0:12}) 日志已清理"fi
}# 解析容器标识
resolve_container_ids() {local input="$1"resolved_matches=()local -a ids=()declare -A name_map=()while read -r id name; doids+=("$id")name_map["$name"]="$id"done < <(docker ps -a --format '{{.ID}} {{.Names}}' --no-trunc)if [[ "$input" =~ ^[0-9]+$ && "$interactive_mode_flag" -eq 1 ]]; thenlocal sorted=($(docker ps -a --format '{{.ID}} {{.Names}}' --no-trunc | sort -k2 | awk '{print $1}'))local index=$((10#$input - 1))if [ "${sorted[$index]}" ]; thenresolved_matches+=("${sorted[$index]}")return 0elsereturn 1fifiif [ "${name_map[$input]}" ]; thenresolved_matches+=("${name_map[$input]}")return 0fifor id in "${ids[@]}"; do[[ "$id" == "$input"* ]] && resolved_matches+=("$id")done[ ${#resolved_matches[@]} -gt 0 ] && return 0 || return 1
}# 批量清理容器日志
clean_multiple() {declare -A cleaned=()for arg in "$@"; doresolved_matches=()resolve_container_ids "$arg"status=$?if [ $status -ne 0 ]; thenecho "❌ 未找到容器标识 '$arg'" >&2continuefifor cid in "${resolved_matches[@]}"; do[ -z "${cleaned[$cid]}" ] && cleaned[$cid]=1 && clean_logs "$cid"donedone[ ${#cleaned[@]} -gt 0 ] && echo "🧹 所有指定容器日志已清理"
}# 交互选择容器
interactive_mode() {interactive_mode_flag=1echo "📋 当前容器列表(按名称升序):"printf "%-4s | %-14s | %s\n" "序号" "容器ID" "容器名称"printf -- "------------------------------\n"local -a sorted_ids=()while read -r id name; dosorted_ids+=("$id")printf "%-4d | %-12s | %s\n" "${#sorted_ids[@]}" "${id:0:12}" "$name"done < <(docker ps -a --format '{{.ID}} {{.Names}}' --no-trunc | sort -k2)echo -n "请输入要清理的 序号/名称/ID前缀(空格分隔多个): "read -r -a inputs[ ${#inputs[@]} -eq 0 ] && echo "⚠️ 未输入任何标识" && exit 1declare -a resolved=()for input in "${inputs[@]}"; doif [[ "$input" =~ ^[0-9]+$ ]]; thenindex=$((10#$input - 1))[ "${sorted_ids[$index]}" ] && resolved+=("${sorted_ids[$index]}") || echo "❌ 无效序号 '$input'" >&2elseresolved+=("$input")fidonedeclare -A preview=()for arg in "${resolved[@]}"; doresolved_matches=()resolve_container_ids "$arg"for cid in "${resolved_matches[@]}"; do[ -z "${preview[$cid]}" ] && preview[$cid]=1donedoneif [ ${#preview[@]} -eq 0 ]; thenecho "⚠️ 未匹配到任何容器" && exit 1fiecho "🧾 即将清理以下容器日志:"for cid in "${!preview[@]}"; docname=$(docker ps -a --filter id="$cid" --format '{{.Names}}')echo "  - $cname (${cid:0:12})"doneecho -n "⚠️ 是否确认清理这些容器日志?(y/N): "read -r -n1 confirm && echo[[ "$confirm" =~ ^[Yy]$ ]] || { echo "❌ 已取消"; exit 0; }clean_multiple "${resolved[@]}"
}# 清理所有容器日志
clean_all() {local force="${1:-0}"local -a all_ids=($(docker ps -a --no-trunc -q))[ ${#all_ids[@]} -eq 0 ] && echo "📭 没有容器可清理" && exit 0if [ "$force" -ne 1 ]; thenecho -n "⚠️ 即将清理 ${#all_ids[@]} 个容器日志,确认?(y/N): "read -r -n1 confirm && echo[[ "$confirm" =~ ^[Yy]$ ]] || { echo "❌ 已取消"; exit 0; }fifor cid in "${all_ids[@]}"; do clean_logs "$cid" 1; doneecho "✅ 所有容器日志已清理"
}# 帮助信息
show_help() {cat <<EOFdlc — Docker Log Cleaner(支持名称、ID前缀、交互序号清理,模糊匹配交互确认)用法: dlc [选项] [容器标识]...选项:-l, --list         交互选择容器(支持多个)-a, --all          清理所有容器日志(默认需确认)-f, --force        跳过确认直接清理(需与 -a 组合使用)-h, --help         显示帮助信息组合参数支持:-af, -fa           等同于 -a -f,清理所有容器日志并跳过确认容器标识支持:- 名称(如 nginx)- ID前缀(如 fc82)- 序号(仅在交互模式下,如 1 2 3)示例:dlc nginx fc82             # 按名称或 ID 前缀清理dlc -l                     # 交互选择容器dlc -a                     # 清理所有容器日志(需确认)dlc -af                    # 清理所有容器日志(跳过确认)清理规则说明:- 主日志文件(container-id-json.log)将被清空内容,文件保留- 滚动日志文件(如 container-id-json.log.1、.log.2.gz 等)将被直接删除- 不影响容器运行状态或其他数据- 若日志文件不存在则跳过,不报错- 支持模糊匹配(ID前缀、名称),交互模式下支持序号选择EOF
}# 主入口
main() {local force=0local all=0local list=0local help=0local args=()local positional=()for raw in "$@"; doif [[ "$raw" =~ ^-([a-zA-Z]{2,})$ ]]; thenfor ((i=1; i<${#raw}; i++)); doargs+=("-${raw:$i:1}")doneelseargs+=("$raw")fidonefor arg in "${args[@]}"; docase "$arg" in-f|--force) force=1 ;;-a|--all)   all=1 ;;-l|--list)  list=1 ;;-h|--help)  help=1 ;;*)          positional+=("$arg") ;;esac
doneif [ "$help" -eq 1 ] || [ "$all$list" == "00" ] && [ ${#positional[@]} -eq 0 ]; thenshow_help
elif [ "$list" -eq 1 ]; theninteractive_mode
elif [ "$all" -eq 1 ]; thenclean_all "$force"
elseclean_multiple "${positional[@]}"
fi
}main "$@"

 

http://www.hskmm.com/?act=detail&tid=34944

相关文章:

  • 软件研发项目管理提效方案|流程驱动 数据赋能:打造上下游信息透明的研发项目管理新模式
  • 2025年10月深度seek排名优化服务排行榜:十大服务商综合对比与选择指南
  • NetSuite-WMS瀚钰通仓库对接使用说明
  • 2025年10月deepseek排名优化服务推荐排行榜:十家服务商综合评测与选择指南
  • 案例分析:MySQL 并行复制竟然比单线程慢?
  • 第二周记
  • 克服keepalived的主备服务器都持有VIP——出现脑裂现象
  • 2025年10月深度关键词排名优化服务推荐排行榜:十大服务商综合对比与评测分析
  • Codeforces Round 1060 (Div. 2) A - C2
  • 2025年10月DeepSeek关键词排名优化服务排行榜深度评测与对比分析
  • 2025 年铁芯源头厂家最新推荐排行榜:精准工艺 + 全场景适配实力甄选,年销 400 万只 + 优质企业权威盘点环形铁芯/互感器铁芯厂家推荐
  • MATLAB实现DLT645协议
  • Maui 实践:让 JavaScript 的 this 怪物如同邻居家(强类型)的乖孩子
  • 钥匙
  • 2025深大电协软件部招新个人题解(部分)
  • [251020 699mAh] 模拟赛破防有感 2.0
  • 2025 年速冻机源头厂家最新推荐榜单:涵盖隧道式、大型、全自动、螺旋、箱式柜式小型等多类型设备,助力食品加工企业选优质供应商
  • 2025 年最新钙片厂家推荐榜单:聚焦四期临床实证与蓝帽认证,为中老年骨健康精选优质品牌指南
  • 2025 年冷却塔源头厂家最新推荐排行榜:无风机无填料节能型设备领衔,优质品牌深度解析
  • 2025年10月超声波清洗机厂家推荐榜:十强对比评测与选购全攻略。
  • 2025年10月超声波清洗机厂家推荐榜:十强对比评测与选购指南。
  • 人狗大战:面向对象关系详解
  • 2025年10月中国数据库排行榜:PolarDB重回榜眼,TDSQL跃进前五
  • 闲言碎语
  • 2025年安恒信息深度解析:AI与数据安全双轮驱动的技术演进与风险透视。
  • 从代码到碳表:MyEMS 开源社区版如何支撑中小企业双碳合规?
  • 2025国内开发者首选:Gitee如何成为本土化代码托管标杆
  • 2025年10月超声波清洗机厂家推荐榜:十强对比评测与选购指南
  • 2025年10月超声波清洗机厂家推荐榜:十强对比评测与选购全攻略
  • 2025 年电气自动化培训学校推荐 —— 湖北中南高职:专注智能制造人才培养,实力护航职业发展