如何批量重命名文件为三位数字?
How to batch rename files to 3-digit numbers?
提前道歉,这个问题不具体。但我的目标是获取一堆图像文件,目前命名为: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
将文件加载到数组中时正确排序文件,请告诉我,因为那样会容易得多。
谢谢!!
这部分取决于您拥有的 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
目前已被注释掉。在取消注释并重命名所有文件之前,请确保输出名称符合您的预期。
EDIT 这段代码中没有真正的错误检查,它只是假设每个文件名都有一个且只有一个句点,以及一个实际的数字作为名称
如果需要,您无需重命名文件即可执行此操作。当您使用 dir
抓取文件时,您将获得如下文件列表:
files =
'0.tif'
'1.tif'
'10.tif'
...
您可以使用 regexp
:
只获取数字部分
nums = regexp(files,'\d+','match');
nums = str2double([nums{:}]);
nums =
0 1 10 11 12 ...
regexp
returns 它作为元胞数组匹配,第二行将其转换回实际数字。
我们现在可以通过对结果数组进行排序来获得实际的数字顺序:
[~,order] = sort(nums);
然后将文件按正确的顺序排列:
files = files(order);
这个应该(我还没有测试过,我手头没有一个装满数字标签文件的文件夹)生成一个文件列表,如下所示:
files=
'0.tif'
'1.tif'
'2.tif'
'3.tif'
...
下面的批处理文件可以重命名您想要的文件:
@echo off
setlocal EnableDelayedExpansion
for /F "delims=" %%f in ('dir /B *.tif') do (
set "name=00%%~Nf"
ren "%%f" "!name:~-3!.tif"
)
请注意,此解决方案会保留原始文件的相同顺序,即使序列中缺少数字也是如此。
提前道歉,这个问题不具体。但我的目标是获取一堆图像文件,目前命名为: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
将文件加载到数组中时正确排序文件,请告诉我,因为那样会容易得多。
谢谢!!
这部分取决于您拥有的 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
目前已被注释掉。在取消注释并重命名所有文件之前,请确保输出名称符合您的预期。
EDIT 这段代码中没有真正的错误检查,它只是假设每个文件名都有一个且只有一个句点,以及一个实际的数字作为名称
如果需要,您无需重命名文件即可执行此操作。当您使用 dir
抓取文件时,您将获得如下文件列表:
files =
'0.tif'
'1.tif'
'10.tif'
...
您可以使用 regexp
:
nums = regexp(files,'\d+','match');
nums = str2double([nums{:}]);
nums =
0 1 10 11 12 ...
regexp
returns 它作为元胞数组匹配,第二行将其转换回实际数字。
我们现在可以通过对结果数组进行排序来获得实际的数字顺序:
[~,order] = sort(nums);
然后将文件按正确的顺序排列:
files = files(order);
这个应该(我还没有测试过,我手头没有一个装满数字标签文件的文件夹)生成一个文件列表,如下所示:
files=
'0.tif'
'1.tif'
'2.tif'
'3.tif'
...
下面的批处理文件可以重命名您想要的文件:
@echo off
setlocal EnableDelayedExpansion
for /F "delims=" %%f in ('dir /B *.tif') do (
set "name=00%%~Nf"
ren "%%f" "!name:~-3!.tif"
)
请注意,此解决方案会保留原始文件的相同顺序,即使序列中缺少数字也是如此。