如何批量重命名文件为三位数字?

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"
)

请注意,此解决方案会保留原始文件的相同顺序,即使序列中缺少数字也是如此。