求助:基于子域名分类迁移多格式文件至对应目录的实现方案
多格式文件按子域名归类的实现方案
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
相关产品推荐
相关产品推荐

