#!/usr/bin/env bash #----------------------------------------------------- # 先收集所有“需要重命名”的目录,再统一重命名 #----------------------------------------------------- rename_dirs_deepest_first() { echo "==> Searching for directories containing 'NiBot' ..." # 收集所有包含“NiBot”的目录,排除 .git # -path '*/.git*' -prune -o :跳过 .git # -type d :只搜索目录 # -depth :让 find 先列出子目录,再列出父目录(自下而上) # -print :把结果打印到 stdout mapfile -t DIRS < <(find . -path '*/.git*' -prune -o -type d -name "*NiBot*" -depth -print) # 逐个重命名,越深的目录会在前面列出(因为-depth先处理子目录) for old_dir in "${DIRS[@]}"; do # 生成新名字 new_dir=$(echo "$old_dir" | sed 's/NiBot/Voyager/g') # 如果名称确实不同就执行 mv if [[ "$old_dir" != "$new_dir" ]]; then echo "Renaming directory:" echo " $old_dir" echo "-> $new_dir" mv "$old_dir" "$new_dir" fi done } #----------------------------------------------------- # 收集所有“需要重命名”的文件,再统一重命名 #----------------------------------------------------- rename_files_deepest_first() { echo "==> Searching for files containing 'NiBot' ..." # 收集所有包含“NiBot”的文件,排除 .git mapfile -t FILES < <(find . -path '*/.git*' -prune -o -type f -name "*NiBot*" -depth -print) # 逐个重命名 for old_file in "${FILES[@]}"; do new_file=$(echo "$old_file" | sed 's/NiBot/Voyager/g') if [[ "$old_file" != "$new_file" ]]; then echo "Renaming file:" echo " $old_file" echo "-> $new_file" mv "$old_file" "$new_file" fi done } #----------------------------------------------------- # 主流程:先处理目录,再处理文件 #----------------------------------------------------- rename_dirs_deepest_first rename_files_deepest_first echo "All done!"