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

