音乐文件夹批量归类求助:按名称自动创建父文件夹并移动
嘿,我之前整理自己的音乐库时也遇到过一模一样的需求!Advanced Renamer搞不定的话,用脚本反而更直接,给你两个平台的靠谱方案:
Linux Bash 解决方案
直接在你的音乐文件夹里打开终端,运行这段脚本就行:
for dir in */; do # 提取第一个 "-" (带前后空格)之前的部分作为父文件夹名 parent_dir="${dir%% - *}" # 自动创建父文件夹(-p 参数确保即使有嵌套目录也能创建,这里虽然用不上但更稳妥) mkdir -p "$parent_dir" # 把原文件夹移动到对应的父文件夹下 mv "$dir" "$parent_dir/" done
关键细节解释:
*/会匹配当前目录下所有的子文件夹(自带末尾斜杠,避免和文件混淆)${dir%% - *}是Bash的参数扩展技巧:%%表示从字符串末尾开始删除最长的匹配内容,这里精准匹配第一个-及之后的所有字符,完美提取你要的乐队名(比如「AC DC」「AC_DC」)- 所有变量都用双引号括起来,能完美处理文件夹名里的空格、下划线这些特殊字符,不会出问题
Windows PowerShell 解决方案
如果用Windows,PowerShell是最靠谱的选择(比CMD批处理省心太多):
- 打开PowerShell,导航到你的音乐文件夹(比如
cd D:\Music) - 运行这段脚本:
Get-ChildItem -Directory | ForEach-Object { # 按第一个 "- " 分割文件夹名,只取前半部分作为父文件夹名 $parentDir = $_.Name -split ' - ', 2 | Select-Object -First 1 # 安全拼接父文件夹的完整路径 $parentPath = Join-Path -Path $_.DirectoryName -ChildPath $parentDir # 如果父文件夹不存在,就创建它 if (-not (Test-Path -Path $parentPath)) { New-Item -ItemType Directory -Path $parentPath | Out-Null } # 把原文件夹移动到父文件夹里 Move-Item -Path $_.FullName -Destination $parentPath }
为啥选PowerShell?
Get-ChildItem -Directory精准获取所有子文件夹,不会碰文件-split ' - ', 2只按第一个-分割,完全不用担心文件夹名里后续出现的-干扰结果- 全程用PowerShell的内置命令处理路径,自动适配带空格的文件名,不会出现CMD里的各种奇怪问题
可选:Windows CMD 批处理方案(不推荐)
如果你非要用CMD,这个脚本也能凑合用,但对带特殊字符的文件夹名支持很差,容易出错:
@echo off setlocal enabledelayedexpansion for /d %%d in (*) do ( set "dirName=%%d" for /f "tokens=1* delims=-" %%a in ("!dirName!") do ( set "parentDir=%%a" rem 去掉父文件夹名末尾的空格(因为分割后会带个空格) set "parentDir=!parentDir:~0,-1!" if not exist "!parentDir!" mkdir "!parentDir!" move "%%d" "!parentDir!" ) ) endlocal
注意:这个脚本会把「AC DC - ...」变成「AC DC」父文件夹,但如果文件夹名里有其他特殊字符(比如方括号),可能会出问题,所以还是优先用PowerShell。
内容的提问来源于stack exchange,提问作者Krippl
相关产品推荐
相关产品推荐

