#!/bin/bash #=========================================== # 将当前目录下大量文件按 aa/ab/ac... 分组 # 每组放 100 个文件 #=========================================== set -e # 每组的文件数 FILES_PER_DIR=100 # 统计总文件数(排除目录、脚本自身、已存在的 aa-zz 目录) TOTAL_FILES=$(find . -maxdepth 1 -type f | wc -l) echo "当前目录文件总数: $TOTAL_FILES" echo "每组放 $FILES_PER_DIR 个文件" echo "" # 检查是否已有 aa-zz 目录,避免重复执行 EXISTING_DIR=$(find . -maxdepth 1 -type d -name '[a-z][a-z]' 2>/dev/null | wc -l) if [ "$EXISTING_DIR" -gt 0 ]; then echo "⚠️ 检测到已有 $EXISTING_DIR 个 aa-zz 目录,请确认是否已执行过此脚本" echo "按 Ctrl+C 取消,或继续执行..." sleep 3 fi # 生成两位字母目录名:aa ab ac ... zz DIRS=() for first in {a..z}; do for second in {a..z}; do DIRS+=("${first}${second}") done done NEEDED_DIRS=$(( (TOTAL_FILES + FILES_PER_DIR - 1) / FILES_PER_DIR )) echo "需要目录数: $NEEDED_DIRS" echo "可用目录数(aa-zz): ${#DIRS[@]}" if [ "$NEEDED_DIRS" -gt "${#DIRS[@]}" ]; then echo "❌ aa-zz 最多 676 个目录,不够用!文件太多或 FILES_PER_DIR 太小" exit 1 fi echo "" echo "创建目录并移动文件..." echo "----------------------------------------" INDEX=0 COUNT=0 for file in *; do # 跳过目录 [ -f "$file" ] || continue # 跳过脚本自身 [ "$file" = "$(basename "$0")" ] && continue DIR_NAME="${DIRS[$INDEX]}" # 如果是新分组,创建目录 if [ $((COUNT % FILES_PER_DIR)) -eq 0 ]; then mkdir -p "$DIR_NAME" echo "创建目录: $DIR_NAME" fi # 移动文件 mv "$file" "$DIR_NAME/" echo " $file → $DIR_NAME/" COUNT=$((COUNT + 1)) # 满一组切到下一个目录 if [ $((COUNT % FILES_PER_DIR)) -eq 0 ]; then INDEX=$((INDEX + 1)) fi done echo "" echo "========================================" echo "✅ 处理完成" echo "总文件数: $COUNT" echo "目录数: $((INDEX + 1))" echo "目录范围: ${DIRS[0]} ~ ${DIRS[$INDEX]}" echo "========================================"