我们的需求是:从文件系统中复制一堆文件到另一个地方,这堆文件的文件名写在.csv文件里面。虽然各种操作系统(Linux,Mac)都提供了一堆的批量复制文件的指令。但是对我们的需求,还是无能为力。因此,我们就简单地用matlab来实现一下。
函数定义
这个函数有四个参数:
function flag = csvcp(src_file_dir,dst_file_dir,csv_filename,jump_first_line)
src_file_dir 待移动文件夹的路径
dst_file_dir 目标文件夹路径
csv_filename csv文件的完整路径
jump_first_line boolean型,默认为true,表示是否跳过CSV文件第一行的内容,默认跳过。
参数处理
作为一头有着强烈处女座情节的牛,参数处理肯定得写好。直接上代码吧。
if nargin<2||nargin>4
disp('Argument Count incorrect! ');
flag=false;
return;
end
if nargin==2
disp('Using default csv file name filelist.csv ');
disp('Jumping first line in the csv file');
csv_filename='filelist.csv';
jump_first_line=true;
end
if exist(dst_file_dir,'dir')~=7
disp(['Destinate file folder ',dst_file_dir,' not exist,CREATING']);
mkdir(dst_file_dir);
end
if exist(csv_filename,'file')==0
csv_filename=[src_file_dir,'/../',csv_filename];
if exist(csv_filename,'file')==0
disp('Csv file not exist');
flag=false;
return;
else
disp('Using csv file near the source image folder!');
end
end
读取csv文件
fid=fopen(csv_filename,'r');
[filelist]=textscan(fid,'%s%*[^\n]');
filelist=filelist{1,1};
if jump_first_line==true
startindex=2;
else
startindex=1;
end
批量移动文件
if numel(filelist)>0
for i=startindex:numel(filelist)
copyfile([src_file_dir,'/',filelist{i}],[dst_file_dir,'/',filelist{i}]);
disp(['copying file: ',filelist{i}]);
end
flag=true;
else
disp('csv file content error! ');
flag=false;
return;
end
disp('Done!');
完整代码
最近学着使用github托管代码。以上的代码托管在:
https://github.com/ColdZoo/csvcp
你都看到这里了,给个星星吧~
测试与使用
使用起来很简单,需要准备的东东是。
- csv文件,保存你要复制的文件名称。
- csvcp的代码,从github上clone下来最新版的即可
-
你要复制的文件夹。
复制的命令是(matlab下):
csvcp(‘src_dir’,’dst_dir’,’filelist.csv’,true);
其中第三第四个参数可以省略。目标文件夹不存在的话会自动生成。当然源文件夹是必须得存在的(否则你复制什么)。
关于csv文件的生成
csv文件是一个你需要复制文件的列表。
应该类似于下面这种形式:
Copy File List
1.jpg
2.jpg
3.mkv
4.jpg
这种CSV文件只有一列,第一行是列名,应该被省略(第四个参数)。
在Mac和Linux下可以简单地用SHELL脚本自动生成。
例如,你要复制的文件都在文件夹img里面。
那么做完下列这些命令,filelist.csv文件会自动生成
White-Knight:Desktop zhengcai$ cd img
White-Knight:img zhengcai$ ls
SinaWeibo.png map-bg.jpg qq@2x.png
TencentWeibo.png mockedup-news.png ribbon-apple.png
examples mooning.png trash.png
facebook.png neg.png twitter.png
filelist.csv neutral.png wechat.png
glyphicons-halflings-white.png path.png white_wall_hash.png
glyphicons-halflings.png pos.png
instagram.png qq.png
White-Knight:img zhengcai$ ls >> ../filelist.csv