我事先道歉,这个问题并不具体。但我的目标是拍摄一堆图像文件,目前命名为:0.tif,1.tif,2.tif等...并将它们重命名为000.tif,001.tif,002 .tif,...,010.tif等......
我想这样做的原因是因为我试图将图像加载到matlab中并进行批处理,但是matlab没有正确地对它们进行排序。我使用dir命令作为dir(*.tif)
来获取所有图像并将它们加载到我可以迭代并处理的文件数组中,但是在这个数组元素1中是0.tif,元素2是1.tif,元素3是10.tif,元素4是100.tif,等等。
我希望在处理元素时保持元素的顺序。但是,我不在乎是否必须在处理它们之前改变元素的顺序(即我可以使其重命名,例如,如果必须的话,可以使用2.tif到10.tif)但我正在寻找一个以我最初描述的方式转换文件名的方法。
如果有更好的方法让matlab在使用dir
将文件加载到数组中时正确排序文件,请告诉我,因为这样会更容易。
谢谢!
答案 0 :(得分:3)
如果需要,您可以执行此操作而无需重命名文件。当您使用dir
抓取文件时,您将拥有如下文件列表:
files =
'0.tif'
'1.tif'
'10.tif'
...
您可以使用regexp
nums = regexp(files,'\d+','match');
nums = str2double([nums{:}]);
nums =
0 1 10 11 12 ...
regexp
将其匹配作为单元格数组返回,第二行将其转换回实际数字。
我们现在可以通过对结果数组进行排序来获得实际的数字顺序:
[~,order] = sort(nums);
然后按正确顺序放置文件:
files = files(order);
这个应该(我还没有测试过,我没有一个文件夹里装满数字标签的文件),产生一个像这样的文件列表:
files=
'0.tif'
'1.tif'
'2.tif'
'3.tif'
...
答案 1 :(得分:1)
这部分取决于您拥有的matlab版本。如果您的版本为findstr
,则应该可以正常使用
num_files_to_rename = numel(name_array);
for ii=1:num_files_to_rename
%in my test i used cells to store my strings you may need to
%change the bracket type for your application
curr_file = name_array{ii};
%locates the period in the file name (assume there is only one)
period_idx = findstr(curr_file ,'.');
%takes everything to the left of the period (excluding the period)
file_name = str2num(curr_file(1:period_idx-1));
%zeropads the file name to 3 spaces using a 0
new_file_name = sprintf('%03d.tiff',file_name)
%you can uncomment this after you are sure it works as you planned
%movefile(curr_file, new_file_name);
end
现在已注释掉实际的重命名操作movefile
。在取消注释并重命名所有文件之前,请确保输出名称符合您的预期。
编辑此代码中没有真正的错误检查,它只是假设每个文件名都有一个且只有一个句点,并且实际的数字是名称
答案 2 :(得分:0)
下面的批处理文件会重命名您想要的文件:
@echo off
setlocal EnableDelayedExpansion
for /F "delims=" %%f in ('dir /B *.tif') do (
set "name=00%%~Nf"
ren "%%f" "!name:~-3!.tif"
)
请注意,即使序列中缺少数字,此解决方案也会保留原始文件的相同顺序。