Under a folder, I have a lot of .mat. "19800101.mat", "19800102.mat", ......."19800201.mat", "19800202.mat", ......"19801201.mat".... I want to copy "19800101.mat", "19800102.mat", and copy others which also belong to January to a new folder, and display this new folder directory. February to a another new folder, and so on. Thanks.

 採用された回答

Walter Roberson
Walter Roberson 2016 年 3 月 8 日

1 投票

destdirs = {'January', 'February', 'March', ... 'December'};
ndests = length(destdirs);
for K = 1 : ndests
if ~exist(destdirs{K}, 'dir'); mkdir(destdirs{K}); end
end
dinfo = dir('*.mat');
filenames = {dinfo.name};
%remove filenames that are not a 4 digit year followed by a 2 digit month followed by a
%2 digit day followed by .mat. Years starting in 0, 1, or 2 are accepted with this check
namebad = cellfun(@isempty, regexp(filenames, '[012]\d\d\d[01]\d\d\d\.mat$') );
filenames(namebad) = [];
nfiles = length(filenames);
for K = 1 : nfiles
thisfile = filenames{K};
monthnum = sscanf(thisfile, '%*4d%2d', 1);
if monthnum > ndests
fprintf('File has invalid month number, skipping "%s"\n', thisfile);
else
destdir = destdirs{monthnum};
copyfile( thisfile, destdir );
end
end

4 件のコメント

Jason
Jason 2016 年 3 月 8 日
You are genius.
But if all my .mat is not in current directory, e.g, they are in 'C:\Program Files\MATLAB\R2015b\bin\data'
How do I change following code?
"dinfo = dir('*.mat');"
I change to following one, but not working.
dinfo = dir('C:\Program Files\MATLAB\R2015b\bin\data\*.mat');
Walter Roberson
Walter Roberson 2016 年 3 月 8 日
projectdir = 'C:\Program Files\MATLAB\R2015b\bin\data';
destdirs = {'January', 'February', 'March', ... 'December'};
ndests = length(destdirs);
for K = 1 : ndests
if ~exist(destdirs{K}, 'dir'); mkdir(destdirs{K}); end
end
dinfo = dir( fullfile(projectdir, '*.mat') );
filenames = {dinfo.name};
%remove filenames that are not a 4 digit year followed by a 2 digit month followed by a
%2 digit day followed by .mat. Years starting in 0, 1, or 2 are accepted with this check
namebad = cellfun(@isempty, regexp(filenames, '[012]\d\d\d[01]\d\d\d\.mat$') );
filenames(namebad) = [];
nfiles = length(filenames);
for K = 1 : nfiles
thisfile = filenames{K};
monthnum = sscanf(thisfile, '%*4d%2d', 1);
if monthnum > ndests
fprintf('File has invalid month number, skipping "%s"\n', thisfile);
else
destdir = destdirs{monthnum};
copyfile( fullfile(projectdir, thisfile), destdir );
end
end
Jason
Jason 2016 年 3 月 8 日
Thank you so so so much. It works for me now.
Walter Roberson
Walter Roberson 2016 年 3 月 8 日
Please click to Accept the answer.

サインインしてコメントする。

その他の回答 (2 件)

John BG
John BG 2016 年 3 月 8 日
編集済み: John BG 2016 年 3 月 8 日

0 投票

Hi Jason
one way to copy files is with command dos
path1='put here full destination path' % for instance D:\Documents\backup\'
dos('copy file_name.mat path1')
If you find this answer of any help solving your question, please click on the thumbs-up vote link,
thanks in advance
John

2 件のコメント

Jason
Jason 2016 年 3 月 8 日
Thanks. But I do not think your code cannot work.
Jan
Jan 2016 年 3 月 8 日
MAtlab's copyfile is more direct and faster than starting a DOS command. If there is really a reason to call DOS, use:
dos(['copy file_name.mat ', path1])

サインインしてコメントする。

Prajwol Tamrakar
Prajwol Tamrakar 2020 年 5 月 27 日

0 投票

This issue of copying file to another directory is possibly due to "ready only access". Use 'f' option to override the read-only status of the destination folder.
copyfile(SourceFile, DestinyFile, 'f')

カテゴリ

タグ

質問済み:

2016 年 3 月 7 日

回答済み:

2020 年 5 月 27 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by