搜索某一路径下的全部重复文件——MATLAB方法

问题描述

个人原创,转载或引用请注明来源!

Windows电脑中,使用MATLAB对某一路径下的全部文件夹/各级子文件夹进行扫描,返回包含的全部文件,并对文件进行重复性检测,返回重复文件

代码

本代码包含3部分,主函数main,子函数file_list()、is_repeat()。

·主函数

主函数的基本原则是分层扫描,使用dir()对当前层扫描之后将文件与文件夹分类——文件归档至file_str_total,文件夹归档至folder_str_current;随后对folder_str_current包含的每个子文件夹进行扫描;每层扫描开始前,file_str_total不清空,folder_str_current清空。
最后对返回的文件名进行重复性判断。

%% main
% 本函数用于判断path文件夹下是否存在重复文件
% 若存在重复文件则输出重复文件与其对应的地址(repeat_record)
path='D:\Joe\Desktop';
[file_str_total,folder_str_root]=file_list(path);
folder_str_current=folder_str_root;
layer=0; % 记录子文件夹层数
tic
while(1)
    layer=layer+1;
    folder_str_old=folder_str_current;
    folder_str_current=[];
    for i=1:size(folder_str_old,1)
        [file_str,folder_str]=file_list(fullfile(folder_str_old(i).folder,folder_str_old(i).name));
        temp=[file_str_total;file_str];
        file_str_total=temp;
        temp=[folder_str_current;folder_str];
        folder_str_current=temp;
    end
    if isempty(folder_str_current)
        break;
    end
end
toc
tic
repeat_record=is_repeat(file_str_total);
toc

·子函数file_list()

子函数file_list()返回path路径下的所有文件名与文件夹名的结构体,并去除‘.’和’…'的标称。
在file_list()中根据isdir标识符判断当前值为文件还是文件夹。

%% file_list.m
% 返回path路径下的所有文件名与文件夹名的结构体,并去除‘.’和'..'的标称
function [file_str,folder_str]=file_list(path) 
str=dir(path);
file_str=[];folder_str=[];
for i=1:size(str,1)
    if ~(strcmp(str(i).name,'.') || strcmp(str(i).name,'..'))
        if str(i).isdir==true
            temp=[folder_str;str(i)];
            folder_str=temp;
        else
            temp=[file_str;str(i)];
            file_str=temp;
        end
    end
end
end

·子函数is_repeat

子函数is_repeat找到并返回重复的文件名的结构体。
子函数is_repeat的基本思想是先对file_str进行去重,再使用find()对去重前后进行对比,每次返回的索引值个数>1表示该文件存在重复。

%% is_repeat.m
% 找到并返回重复的文件名的结构体
function repeat_record=is_repeat(file_str)
name=[];
for i=1:size(file_str,1)
    temp=[name;string(file_str(i).name)];
    name=temp;
end
unique_name=unique(name);
repeat_seq=[];
for i=1:size(unique_name,1)
    seq=find(name==unique_name(i));
    if length(seq)>1
        temp=[repeat_seq;seq];
        repeat_seq=temp;
    end
end
repeat_record=file_str(repeat_seq);
end

此代码可以帮助用户快速检测重复文件。
但是此代码只使用了文件名这一个维度来检测相似性,后续还可以:

  • 为其添加文件大小的维度来实现更加精确的搜索功能;
  • 对比文件名和文件大小的相似程度增加模糊搜索的功能。

对于本文档,如果有任何疑问或建议,欢迎留言讨论,共同进步。

你可能感兴趣的:(matlab)