我想在目录中制作源文件的副本,然后将其粘贴到SAME目录中,但名称不同。我想循环一些参与者。源文件的名称因参与者而异(尽管它始终具有相同的起始点)。
我写了以下循环:
file_root = '/pathtofile/';
sourcefile = 'ABCDE.nii';
destinationfile = 'FGHIJ.nii';
for s = 1:length(subjects) % loops over subjects
copyfile([file_root subjects{s} '/' 'stats' '/' sourcefile], [file_root subjects{s} '/' 'stats' '/' destinationfile]);
end
此循环适用于具有相同源文件名的主题子集,并且它在SAME目录中正确生成目标文件作为源文件。
现在,当我在源文件中包含一个通配符来处理源文件中的不同名称时,循环仍然有效,但它会生成一个名为destinationfile的新目录,其中包含源文件的副本(具有相同的名称)。所以,例如:
file_root = '/pathtofile/';
sourcefile = 'ABCD*.img';
destinationfile = 'FGHIJ.img';
for s = 1:length(subjects) % loops over subjects
copyfile([file_root subjects{s} '/' 'stats' '/' sourcefile], [file_root subjects{s} '/' 'stats' '/' destinationfile]);
end
此循环生成一个新目录'FGHIJ.img',其中包含'file_root'目录中的'ABCDE.img'文件。
所以我的问题是:如何在源中使用带有通配符的copyfile(源,目标),这会在同一目录中生成新的目标文件。
我希望这是有道理的。任何帮助/建议将不胜感激!
答案 0 :(得分:1)
使用通配符时,copyfile
假定您正在将多个文件复制到文件夹,从而将目标解释为目录。您不能使用通配符并设置目标文件。使用dir
命令获取匹配的文件名。
我还建议使用fullfile
来连接文件路径,因为它更健壮
file_root = '/pathtofile/';
sourcefile = 'ABCD*.img';
destinationfile = 'FGHIJ.img';
for s = 1:length(subjects) % loops over subjects
source_pattern=fullfile(file_root subjects{s} , 'stats' , sourcefile);
matching_files=dir(source_pattern);
source_file=fullfile(file_root subjects{s} , 'stats' , matching_files(1).name);
target_file=fullfile(file_root subjects{s} , 'stats' , destinationfile)
copyfile(source_file, target_file);
end
答案 1 :(得分:0)
虽然copyfile无法识别* .img来表示您想象的通配符,但您的问题仍然有意义。
更好的做法(可能不是最好的,但我会做的)是生成目录中的文件列表,可以使用*通配符:
file_root = '/pathtofile/';
for s = 1:length(subjects) % loops over subjects
%create the directory for this subject
subject_dir = fullfile(file_root,subjects{s},'stats');
%get a struct of the .img files beginning with ABCD with the dir command
subject_sources = dir(subject_dir,'ABCD*.img');
%loop through the source files and copy them
for fidx = 1:length(subject_sources)
source_fname = subject_sources(fidx).name;
%of course you can add lines to format/create a proper
%destination file name. strtok, strsplit, regexp...
dest_fname = ['FGHIJ' s(5:end)];
copyfile(fullfile(subject_dir,source_fname),...
fullfile(subject_dir,dest_fname)
end
end