2015-07-08 4 views
1

Извиняюсь заранее, что этот вопрос не является конкретным. Но моя цель - собрать кучу файлов изображений, которые в настоящее время называются: 0.tif, 1.tif, 2.tif и т. Д. ... и переименовывать их точно так же, как цифры в 000.tif, 001.tif, 002 .tif, ..., 010.tif и т. д.Как переименовать файлы в 3-значный номер?

Причина, по которой я хочу это сделать, заключается в том, что я пытаюсь загрузить изображения в 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 возвращает свои матчи в клетке -array, вторая строка преобразует его обратно в фактические числа.

Теперь мы можем получить фактический числовой порядок путем сортировки результирующего массива:

[~,order] = sort(nums); 

, а затем поместить файлы в правильном порядке:

files = files(order); 

Этот должен (я гавань» t проверил его, у меня нет папки, полной числовых файлов с надписью), создайте список таких файлов:

files= 
    '0.tif' 
    '1.tif' 
    '2.tif' 
    '3.tif' 
    ... 
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 закомментирована сейчас. убедитесь, что имена выходов так же, как вы ожидали, прежде чем раскомментировать его и переименовать все файлы.

EDIT нет никакой реальной проверки ошибок в этом коде, он просто принимает каждое имя файла имеет один и только один период, и фактическое число в качестве имени

+0

Вместо использования 'findstr' вы можете использовать' fileparts'. – MrAzzaman

0

файл Batch ниже делать переименование файлов, которые вы хотите:

@echo off 
setlocal EnableDelayedExpansion 

for /F "delims=" %%f in ('dir /B *.tif') do (
    set "name=00%%~Nf" 
    ren "%%f" "!name:~-3!.tif" 
) 

Обратите внимание, что это решение сохранить тот же порядок ваших исходных файлов, даже если есть недостающие числа в последовательности ..