Matlab: последовательное переименование файлов в папке

#matlab #file #renaming

#matlab #файл #переименование

Вопрос:

Если в папке есть следующие файлы C:test:

файл1.TIF, file2.TIF …. file100.TIF

Может ли MatLab автоматически переименовывать их в:

file_0001.TIF, file_0002.TIF, …. file_0100.TIF?

Комментарии:

1. Я думаю, если вы загрузите их в цикл for и сохраните их с новым именем, вы могли бы это сделать. Я не знаю, есть ли способ сделать это, не открывая и не закрывая их

2. Посмотрите movefile . Интересно, может ли быть подход с использованием массива ячеек без цикла или, может быть, с cellfun , который, я сомневаюсь, привел бы к улучшению производительности, возможно, самое большее, к элегантности.

3. Спасибо #Ander Biguri и #Divakar

Ответ №1:

Подход без цикла —

 directory  = 'C:test'; %//' Directory where TIFF images are present
filePattern = fullfile(directory, 'file*.tif'); %//' files pattern with absolute paths
old_filename = cellstr(ls(filePattern)) %// Get the filenames
file_ID = strrep(strrep(old_filename,'file',''),'.TIF','') %// Get numbers associated with each file
str_zeros = arrayfun(@(t) repmat('0',1,t), 5-cellfun(@numel,file_ID),'uni',0) %// Get zeros string to be pre-appended to each filename
new_filename = strcat('file_',str_zeros,file_ID,'.TIF') %// Generate new filenames
cellfun(@(m1,m2) movefile(m1,m2),fullfile(directory,old_filename),fullfile(directory,new_filename)) %// Finally rename files with the absolute paths
  

Редактировать 1:

Для случая, когда у вас есть имена файлов как file27.TIF , file28.TIF , file29.TIF и так далее, и вы хотели бы переименовать их как file0001.TIF , file0002.TIF , file0003.TIF и так далее соответственно, попробуйте это —

 directory  = 'C:test'; %//' Directory where TIFF images are present
filePattern = fullfile(directory, 'file*.tif'); %//' files pattern with absolute paths
old_filename = cellstr(ls(filePattern)) %// Get the filenames
file_ID = strrep(strrep(old_filename,'file',''),'.TIF','') %// Get numbers associated with each file

file_ID_doublearr = str2double(file_ID)
file_ID_doublearr = file_ID_doublearr - min(file_ID_doublearr) 1

file_ID = strtrim(cellstr(num2str(file_ID_doublearr)))

str_zeros = arrayfun(@(t) repmat('0',1,t), 4-cellfun(@numel,file_ID),'uni',0) %// Get zeros string to be pre-appended to each filename
new_filename = strcat('file',str_zeros,file_ID,'.TIF') %// Generate new filenames
cellfun(@(m1,m2) movefile(m1,m2),fullfile(directory,old_filename),fullfile(directory,new_filename)) %// Finally rename files with the absolute paths
  

Комментарии:

1. Я знал, что должен быть способ сделать это без цикла.

2. @excaza Да, я думаю, arrayfun и cellfun только привнесите «элегантность» в таблицу, я сомневаюсь, что будет улучшение производительности.

3. Большое вам спасибо. Как насчет того, есть ли у меня в папке следующие файлы: file27. TIF, файл28. TIF, file29.TIF. Могу ли я переименовать их, начиная с 0001, т. Е. переименовать их в: file0001.TIF, file0002.TIF, file0003.TIF

4. @Mosawi Да, я так думаю. После того, как у вас есть file_ID , сделайте это — file_ID = file_ID - 26 , str_zeros = arrayfun(@(t) repmat('0',1,t), 4-cellfun(@numel,file_ID),'uni',0) и, наконец new_filename = strcat('file',str_zeros,file_ID,'.TIF')

5. Для (file_ID — 6) я получаю ошибку «Неопределенная функция ‘минус’ для входных аргументов типа ‘ячейка'». Есть идеи, как это исправить?

Ответ №2:

Немного более надежный метод:

 dirlist = dir(fullfile(mypath,'*.TIF'));
fullnames = {dirlist.name}; % Get rid of one layer of cell array-ness

[~,fnames,~] = cellfun(@fileparts,fullnames,'UniformOutput',false); % Create cell array of the file names from the output of dir()
fnums = cellfun(@str2double,regexprep(fnames,'[^0-9]','')); % Delete any character that isn't a number, returns it as a vector of doubles
fnames = regexprep(fnames,'[0-9]',''); % Delete any character that is a number

for ii = 1:length(dirlist)
    newname = sprintf('%s_d.TIF',fnames{ii},fnums(ii)); % Create new file name

    oldfile = fullfile(mypath,dirlist(ii).name); % Generate full path to old file
    newfile = fullfile(mypath,newname);          % Generate full path to new file

    movefile(oldfile, newfile); % Rename the files
end
  

Хотя это позволит разместить имена файлов любой длины, предполагается, что в имени файла нет чисел, кроме счетчика в конце. MATLAB любит помещать объекты во вложенные массивы ячеек, поэтому я включил cellfun в пару мест, чтобы привести объекты к более управляемым форматам. Это также позволяет нам векторизовать часть кода.