You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于子域名分类迁移多格式文件至对应目录的实现方案

多格式文件按子域名归类的实现方案

Bash 改进版(支持所有指定格式)

针对你提供的原有Bash代码,修改后可一次性处理.csv、.pdf、.xml、.txt、.xlsx所有格式文件,同时正确提取子域名前缀作为文件夹名:

# 定义需要处理的文件格式
formats=("csv" "pdf" "xml" "txt" "xlsx")

# 遍历所有目标格式文件
for fmt in "${formats[@]}"; do
    for file in *."$fmt"; do
        # 跳过通配符匹配不到文件的情况
        [ -f "$file" ] || continue
        
        # 提取_之前的前缀(如果有_),否则提取去掉扩展名的文件名
        if [[ "$file" == *_* ]]; then
            prefix="${file/_*/}"
        else
            prefix="${file%.$fmt}"
        fi
        
        # 提取前缀中第一个.之前的部分作为文件夹名
        folder="${prefix%%.*}"
        
        # 创建文件夹(已存在则忽略错误)
        mkdir -p "$folder" 2>/dev/null
        # 移动文件到对应文件夹
        mv "$file" "$folder/"
    done
done

说明:

  • 用mkdir -p替代原有的mkdir,更稳妥(递归创建目录,已存在时无报错)
  • 统一处理带_和不带_的文件名,无需分开写两个循环
  • 明确指定需要处理的格式,避免误操作其他文件

Python 实现方案

如果偏好Python,可使用以下脚本,逻辑清晰且跨平台:

import os
import shutil

# 定义需要处理的文件格式
target_formats = {'.csv', '.pdf', '.xml', '.txt', '.xlsx'}

# 遍历当前目录下的所有文件
for filename in os.listdir('.'):
    # 跳过目录,只处理文件
    if not os.path.isfile(filename):
        continue
    
    # 获取文件扩展名,判断是否在目标格式中
    ext = os.path.splitext(filename)[1].lower()
    if ext not in target_formats:
        continue
    
    # 提取前缀部分
    if '_' in filename:
        prefix = filename.split('_', 1)[0]
    else:
        prefix = os.path.splitext(filename)[0]
    
    # 提取文件夹名(第一个.之前的部分)
    folder_name = prefix.split('.', 1)[0]
    
    # 创建文件夹(已存在则无操作)
    os.makedirs(folder_name, exist_ok=True)
    
    # 移动文件到目标文件夹
    shutil.move(filename, os.path.join(folder_name, filename))

PowerShell 实现方案

适合Windows环境的PowerShell版本:

# 定义需要处理的文件格式
$formats = @("*.csv", "*.pdf", "*.xml", "*.txt", "*.xlsx")

# 获取所有目标格式的文件
Get-ChildItem -Path . -Include $formats -File | ForEach-Object {
    $file = $_
    # 提取前缀部分
    if ($file.Name -match '_') {
        $prefix = $file.Name.Split('_', 2)[0]
    } else {
        $prefix = [System.IO.Path]::GetFileNameWithoutExtension($file.Name)
    }
    
    # 提取文件夹名(第一个.之前的部分)
    $folderName = $prefix.Split('.', 2)[0]
    
    # 创建文件夹(已存在则无操作)
    if (-not (Test-Path $folderName)) {
        New-Item -ItemType Directory -Path $folderName | Out-Null
    }
    
    # 移动文件到目标文件夹
    Move-Item -Path $file.FullName -Destination $folderName
}

内容的提问来源于stack exchange,提问作者Ken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:15:47