MATLAB dir文件排序异常解决及批量重命名文件为三位序号
Hey there! Let's work through your two file-related challenges step by step—these are super common pain points when dealing with sequentially numbered files, so I’ve got straightforward solutions for both.
Depending on your preferred tool, here are a few reliable approaches:
Windows 批处理脚本
If you’re on Windows and don’t want to use programming languages, save this as rename_files.bat in your target folder and run it:
@echo off setlocal enabledelayedexpansion set "count=1" :: 遍历当前文件夹中所有纯数字命名的文件 for /f "tokens=* delims=" %%a in ('dir /b /a-d ^| findstr /r "^[0-9]*$"') do ( :: 生成三位数字的新文件名(补前导零) set "num=00!count!" set "num=!num:~-3!" ren "%%a" "!num!" set /a count+=1 ) echo Renaming complete! pause
Python 脚本(跨平台)
For a cross-platform solution, use this Python script—it’s flexible and easy to adjust:
import os folder_path = "./DirContainingFiles1,2,3,..." # 替换为你的文件夹路径 files = [f for f in os.listdir(folder_path) if f.isdigit()] for idx, filename in enumerate(files, start=1): new_name = f"{idx:03d}" # 格式化为三位数字,自动补零 os.rename( os.path.join(folder_path, filename), os.path.join(folder_path, new_name) ) print("Renaming finished successfully!")
MATLAB 脚本
Since you’re working with MATLAB later, here’s a MATLAB version too:
folder_path = 'DirContainingFiles1,2,3,...'; file_names = dir(fullfile(folder_path, '*')); file_names = file_names(~[file_names.isdir]); % 过滤文件夹 for idx = 1:length(file_names) old_name = fullfile(folder_path, file_names(idx).name); new_name = fullfile(folder_path, sprintf('%03d', idx)); % 生成三位数字文件名 movefile(old_name, new_name); end disp('File renaming completed!');
The issue here is that dir() sorts filenames lexicographically (text order) by default—so "10" comes before "2" because the first character "1" has a lower ASCII value than "2". Here’s how to fix your code to traverse files in numerical order:
Modified MATLAB Code
% 获取目标文件夹中的文件信息 file_names = dir('DirContainingFiles1,2,3,...'); % 过滤掉系统默认的.和..文件夹(避免处理非文件项) file_names = file_names(~[file_names.isdir]); % 提取每个文件名中的数字部分 % 使用正则表达式匹配文件名中的所有数字,转换为数值 file_numbers = cellfun(@(name) str2double(regexp(name, '\d+', 'match')), {file_names.name}); % 获取按数字排序的索引 [sorted_nums, sort_indices] = sort(file_numbers); % 重新排序文件信息数组 sorted_file_names = file_names(sort_indices); % 按数字顺序遍历文件 for imgj = 1:length(sorted_file_names) file = sorted_file_names(imgj).name; % 这里插入你的后续处理代码 disp(['Processing file: ', file]); end
How This Works:
- Filter out directories: We exclude
.and..(the current and parent directory entries) so we only work with actual files. - Extract numerical values: Using
regexp, we pull the numeric part from each filename and convert it to a number withstr2double. - Sort by number: The
sortfunction gives us indices that rearrange thefile_namesarray to follow numerical order. - Traverse sorted files: We loop through the sorted array instead of the original lexicographically sorted one.
This ensures you process files 1, 2, 3,...10, 11,... in the correct order every time.
内容的提问来源于stack exchange,提问作者Renuka

