- projects.yaml 支持 scan_dirs 字段,配置一次后续扫描无需传参 - scan-projects.sh 自动跳过已存在的项目 - 支持多目录扫描 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
110 lines
2.4 KiB
Bash
Executable File
110 lines
2.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# 扫描目录下的 git 仓库,生成/更新 projects.yaml
|
|
# 用法: bash scripts/scan-projects.sh [目录...]
|
|
#
|
|
# 不传目录 → 从 projects.yaml 的 scan_dirs 读取
|
|
# 传目录 → 扫描指定目录
|
|
|
|
HUB_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
YAML_FILE="$HUB_DIR/projects.yaml"
|
|
|
|
# 收集扫描目录
|
|
SCAN_DIRS=()
|
|
|
|
if [ $# -gt 0 ]; then
|
|
# 命令行传入的目录
|
|
for arg in "$@"; do
|
|
SCAN_DIRS+=("${arg/#\~/$HOME}")
|
|
done
|
|
elif [ -f "$YAML_FILE" ]; then
|
|
# 从 projects.yaml 的 scan_dirs 读取
|
|
while IFS= read -r line; do
|
|
dir=$(echo "$line" | sed 's/^[[:space:]]*-[[:space:]]*//' | sed "s|~|$HOME|g")
|
|
[ -d "$dir" ] && SCAN_DIRS+=("$dir")
|
|
done < <(grep -A 100 '^scan_dirs:' "$YAML_FILE" | tail -n +2 | grep '^ -' | sed '/^[a-z]/q' | head -20)
|
|
fi
|
|
|
|
# 默认目录
|
|
if [ ${#SCAN_DIRS[@]} -eq 0 ]; then
|
|
SCAN_DIRS=("$HOME/Documents/code")
|
|
fi
|
|
|
|
echo "扫描目录:"
|
|
for d in "${SCAN_DIRS[@]}"; do echo " $d"; done
|
|
echo ""
|
|
|
|
# 收集已有项目(避免重复)
|
|
EXISTING=""
|
|
if [ -f "$YAML_FILE" ]; then
|
|
EXISTING=$(grep 'name:' "$YAML_FILE" | sed 's/.*name:[[:space:]]*//')
|
|
fi
|
|
|
|
# 扫描所有目录
|
|
PROJECTS=""
|
|
COUNT=0
|
|
SKIP=0
|
|
|
|
for SCAN_DIR in "${SCAN_DIRS[@]}"; do
|
|
[ ! -d "$SCAN_DIR" ] && continue
|
|
|
|
for dir in "$SCAN_DIR"/*/; do
|
|
[ ! -d "$dir/.git" ] && continue
|
|
|
|
NAME=$(basename "$dir")
|
|
|
|
# 跳过已存在的
|
|
if echo "$EXISTING" | grep -q "^${NAME}$"; then
|
|
SKIP=$((SKIP + 1))
|
|
continue
|
|
fi
|
|
|
|
PATH_STR="${dir%/}"
|
|
PATH_STR="${PATH_STR/#$HOME/~}"
|
|
|
|
PROJECTS+=" - name: $NAME
|
|
path: $PATH_STR
|
|
description: \"\"
|
|
tags: []
|
|
|
|
"
|
|
COUNT=$((COUNT + 1))
|
|
echo " 新增: $NAME ($PATH_STR)"
|
|
done
|
|
done
|
|
|
|
[ $SKIP -gt 0 ] && echo " 跳过: $SKIP 个已存在的项目"
|
|
echo ""
|
|
|
|
if [ $COUNT -eq 0 ]; then
|
|
echo "没有新项目需要添加"
|
|
exit 0
|
|
fi
|
|
|
|
echo "发现 $COUNT 个新项目"
|
|
|
|
# 确保 projects.yaml 存在
|
|
if [ ! -f "$YAML_FILE" ]; then
|
|
# 读取 scan_dirs 参数生成 scan_dirs 配置
|
|
SCAN_DIRS_YAML=""
|
|
for d in "${SCAN_DIRS[@]}"; do
|
|
d="${d/#$HOME/~}"
|
|
SCAN_DIRS_YAML+=" - $d\n"
|
|
done
|
|
|
|
cat > "$YAML_FILE" << EOF
|
|
# 项目清单 - 由 scan-projects.sh 生成
|
|
|
|
scan_dirs:
|
|
$(echo -e "$SCAN_DIRS_YAML")
|
|
projects:
|
|
$PROJECTS
|
|
EOF
|
|
echo "已创建 $YAML_FILE"
|
|
else
|
|
# 追加到已有文件
|
|
echo "" >> "$YAML_FILE"
|
|
echo " # === 扫描添加 $(date '+%Y-%m-%d') ===" >> "$YAML_FILE"
|
|
echo -n "$PROJECTS" >> "$YAML_FILE"
|
|
echo "已追加到 $YAML_FILE"
|
|
fi
|