Linux下递归重命名子文件夹中同名CSV文件的脚本求助
递归重命名并合并子目录中的spreadsheet.csv文件
原脚本的核心问题是无法递归遍历子目录,且使用ls遍历文件存在安全隐患(比如文件名含空格/特殊字符时会出错),同时rename的变量替换写法有误。以下是两种实用的改进方案:
方案1:重命名并合并到指定目录(推荐)
这个方案会把所有子目录中的spreadsheet.csv重命名为worksheet1.csv、worksheet2.csv...并统一移动到目标目录,直接完成合并需求:
# 初始化计数器 count=1 # 定义合并后的目标目录(可根据需求修改路径) target_dir="./merged_worksheets" # 创建目标目录(不存在则自动创建) mkdir -p "$target_dir" # 递归查找所有子目录中的spreadsheet.csv文件 find . -type f -name "spreadsheet.csv" | while read -r file_path; do # 移动并重命名文件到目标目录 mv "$file_path" "${target_dir}/worksheet${count}.csv" # 计数器自增 ((count++)) done
关键说明:
find . -type f -name "spreadsheet.csv":递归遍历当前目录下所有名为spreadsheet.csv的普通文件while read -r file_path:安全读取文件路径,完美处理带空格或特殊字符的文件名mkdir -p "$target_dir":确保目标目录存在,-p参数会自动创建不存在的上级目录- 若担心覆盖目标目录中已存在的文件,可给
mv添加-n参数(mv -n ...),避免强制覆盖
方案2:原地递归重命名(仅修改文件名,不移动)
如果不需要合并到同一目录,只想把每个子目录中的spreadsheet.csv原地重命名为worksheetN.csv,可使用以下脚本:
count=1 find . -type f -name "spreadsheet.csv" | while read -r file_path; do # 获取文件所在的目录路径 file_dir=$(dirname "$file_path") # 原地重命名文件 mv "$file_path" "${file_dir}/worksheet${count}.csv" ((count++)) done
测试建议
在实际执行脚本前,可把mv替换为echo mv,先打印出要执行的命令,确认路径和重命名规则符合预期:
echo mv "$file_path" "${target_dir}/worksheet${count}.csv"
内容的提问来源于stack exchange,提问作者Rafael Salgado
相关产品推荐
相关产品推荐

