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

Bash PDF评分脚本优化:解决按评分顺序遍历失效问题

问题分析

原脚本的核心问题在于排序逻辑冗余且遍历流程混乱:

  • 内层的sorted_files循环完全无效,因为files数组已经是当前rating对应的文件,再按1-5筛选不会改变顺序。
  • 遍历过程中修改文件评分后,当前循环的rating变量被覆盖,导致后续分组逻辑出错,最终出现随机遍历的情况。
修改方案

重新梳理流程,每一轮严格按**评分升序(1→5)**处理所有未达到5分的PDF文件,具体修改如下:

#!/bin/bash

# 初始化所有PDF的评分为1
for file in Slides/*.pdf; do
    xattr -w rating 1 "$file"
done

while true; do
    all_rated_5=true

    # 严格按评分1到5的顺序遍历处理
    for target_rating in {1..5}; do
        # 收集当前评分等于target_rating且未到5分的PDF文件
        files=()
        while IFS= read -r -d '' file; do
            current_rating=$(xattr -p rating "$file")
            if [[ "$current_rating" == "$target_rating" && "$current_rating" != "5" ]]; then
                files+=("$file")
            fi
        done < <(find Slides -maxdepth 1 -type f -name "*.pdf" -print0)

        # 处理当前评分组的文件
        for file in "${files[@]}"; do
            # 打开PDF
            open "$file"

            # 提示用户评分
            read -p "请为文件 $file 评分(1-5):" new_rating

            # 验证评分合法性(可选,避免无效输入)
            while [[ ! "$new_rating" =~ ^[1-5]$ ]]; do
                read -p "请输入合法评分(1-5):" new_rating
            done

            # 更新文件评分
            xattr -w rating "$new_rating" "$file"

            # 关闭Preview
            osascript -e 'quit app "Preview"'

            # 标记存在未到5分的文件
            all_rated_5=false
        done
    done

    # 所有文件都评5分则退出循环
    if $all_rated_5; then
        echo "所有PDF已评5分,任务完成。"
        break
    fi
done
修改说明
  • 严格按评分顺序遍历:每一轮循环从1到5依次处理对应评分的文件,确保低分文件优先被重新评估。
  • 避免变量覆盖:使用target_rating作为循环变量,避免和用户输入的new_rating冲突。
  • 优化文件收集逻辑:一次读取文件属性,同时筛选出当前评分且未到5分的文件,减少重复操作。
  • 增加评分合法性验证(可选):防止用户输入无效评分导致脚本异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:13:27