답변:
업데이트 : 이 게시물이 꽤 오래되었고 그 기간 동안 내가 사용하기 위해이 유틸리티를 많이 수정했기 때문에 새 버전을 게시해야한다고 생각했습니다. 내 최신 코드는 The MathWorks File Exchange :dirPlus.m
. GitHub 에서 소스를 가져올 수도 있습니다 .
나는 많은 개선을했다. 이제 전체 경로 앞에 추가하거나 파일 이름 만 반환 할 수있는 옵션을 제공합니다 ( Doresoom 및 Oz Radiano Peter D 에서 통합)에 정규식 패턴을 적용하는 . 또한 각 파일에 유효성 검사 기능을 적용하는 기능을 추가하여 파일 이름 (예 : 파일 크기, 내용, 생성 날짜 등) 이외의 기준에 따라 선택할 수 있습니다.
참고 : 최신 버전의 MATLAB (R2016b 이상)에서는dir
함수에 재귀 검색 기능이 있습니다! 따라서 이렇게하면 *.m
현재 폴더의 모든 하위 폴더에있는 모든 파일 목록을 가져올 수 있습니다 .
dirData = dir('**/*.m');
다음은 주어진 디렉토리의 모든 하위 디렉토리를 반복적으로 검색하여 찾은 모든 파일 이름의 목록을 수집하는 함수입니다.
function fileList = getAllFiles(dirName)
dirData = dir(dirName); %# Get the data for the current directory
dirIndex = [dirData.isdir]; %# Find the index for directories
fileList = {dirData(~dirIndex).name}'; %'# Get a list of the files
if ~isempty(fileList)
fileList = cellfun(@(x) fullfile(dirName,x),... %# Prepend path to files
fileList,'UniformOutput',false);
end
subDirs = {dirData(dirIndex).name}; %# Get a list of the subdirectories
validIndex = ~ismember(subDirs,{'.','..'}); %# Find index of subdirectories
%# that are not '.' or '..'
for iDir = find(validIndex) %# Loop over valid subdirectories
nextDir = fullfile(dirName,subDirs{iDir}); %# Get the subdirectory path
fileList = [fileList; getAllFiles(nextDir)]; %# Recursively call getAllFiles
end
end
위의 함수를 MATLAB 경로에 저장 한 후 다음과 같은 방법으로 호출 할 수 있습니다.
fileList = getAllFiles('D:\dic');
fileList = strcat(dirName,filesep,fileList);
CELLFUN을 사용 하는 대신에 할 수 있지만, 그렇게하면 불필요한 파일 구분 기호를 추가로 사용할 수 있습니다. FULLFILE도 처리합니다.
if ~isempty(fileList) fileList = cellfun(@(x) fullfile(dirName,x),... %# Prepend path to files fileList,'UniformOutput',false); matchstart = regexp(fileList, pattern); fileList = fileList(~cellfun(@isempty, matchstart)); end
함수 시그니처를 다음과 같이 변경합니다 getAllFiles(dirName, pattern)
(마지막 줄의 두 번째 줄에도 있음)
디렉토리 내용을 반환 할 dir 을 찾고 있습니다.
결과를 반복하려면 다음을 수행하면됩니다.
dirlist = dir('.');
for i = 1:length(dirlist)
dirlist(i)
end
그러면 다음과 같은 형식으로 출력됩니다.
name: 'my_file'
date: '01-Jan-2010 12:00:00'
bytes: 56
isdir: 0
datenum: []
.
및 ..
?
dir('*.ext')
디렉토리를 자동으로 제외하는를 실행하십시오 (물론 .ext로 끝나지 않는 한)
이 훌륭한 답변에 언급 된 코드를 사용하고 제 경우에 필요한 2 개의 추가 매개 변수를 지원하도록 확장했습니다. 매개 변수는 필터링 할 파일 확장자와 전체 경로를 파일 이름에 연결할지 여부를 나타내는 플래그입니다.
나는 그것이 충분히 명확하고 누군가가 유익하다고 생각하기를 바랍니다.
function fileList = getAllFiles(dirName, fileExtension, appendFullPath)
dirData = dir([dirName '/' fileExtension]); %# Get the data for the current directory
dirWithSubFolders = dir(dirName);
dirIndex = [dirWithSubFolders.isdir]; %# Find the index for directories
fileList = {dirData.name}'; %'# Get a list of the files
if ~isempty(fileList)
if appendFullPath
fileList = cellfun(@(x) fullfile(dirName,x),... %# Prepend path to files
fileList,'UniformOutput',false);
end
end
subDirs = {dirWithSubFolders(dirIndex).name}; %# Get a list of the subdirectories
validIndex = ~ismember(subDirs,{'.','..'}); %# Find index of subdirectories
%# that are not '.' or '..'
for iDir = find(validIndex) %# Loop over valid subdirectories
nextDir = fullfile(dirName,subDirs{iDir}); %# Get the subdirectory path
fileList = [fileList; getAllFiles(nextDir, fileExtension, appendFullPath)]; %# Recursively call getAllFiles
end
end
코드 실행 예 :
fileList = getAllFiles(dirName, '*.xml', 0); %#0 is false obviously
당신은 정규 표현식 사용하거나 제거하기 위해 strcmp와 수 .
및 ..
아니면 사용할 수있는 isdir
경우에만 디렉토리가 아닌 폴더에있는 파일을 원하는 경우 필드.
list=dir(pwd); %get info of files/folders in current directory
isfile=~[list.isdir]; %determine index of files vs folders
filenames={list(isfile).name}; %create cell array of file names
또는 마지막 두 줄을 결합하십시오.
filenames={list(~[list.isdir]).name};
를 제외한 디렉토리의 폴더 목록입니다. 그리고 ..
dirnames={list([list.isdir]).name};
dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',dirnames)));
이 시점부터 중첩 된 for 루프에 코드를 던지고 dirnames가 각 하위 디렉터리에 대해 빈 셀을 반환 할 때까지 각 하위 폴더를 계속 검색 할 수 있어야합니다.
이 답변은 질문에 직접 답하지는 않지만 상자 밖에서 좋은 해결책이 될 수 있습니다.
나는 gnovice의 솔루션을 추천했지만 다른 솔루션을 제공하고 싶습니다. 운영 체제의 시스템 종속 명령을 사용하십시오.
tic
asdfList = getAllFiles('../TIMIT_FULL/train');
toc
% Elapsed time is 19.066170 seconds.
tic
[status,cmdout] = system('find ../TIMIT_FULL/train/ -iname "*.wav"');
C = strsplit(strtrim(cmdout));
toc
% Elapsed time is 0.603163 seconds.
양:
*.wav
파일 을 선택하기 위해 새로운 구문을 배우거나 재발 명 할 필요가 없습니다 .부정:
이것에 대한 단일 기능 방법을 모르지만 하위 디렉토리genpath
목록 만 재귀하는 데 사용할 수 있습니다 . 이 목록은 세미콜론으로 구분 된 디렉토리 문자열로 반환되므로 strread를 사용하여 구분해야합니다.
dirlist = strread(genpath('/path/of/directory'),'%s','delimiter',';')
주어진 디렉토리를 포함하지 않으려면의 첫 번째 항목을 제거하십시오 dirlist
. 즉, dirlist(1)=[];
항상 첫 번째 항목이기 때문입니다.
그런 다음 루프가있는 각 디렉토리의 파일 목록을 가져옵니다 dir
.
filenamelist=[];
for d=1:length(dirlist)
% keep only filenames
filelist=dir(dirlist{d});
filelist={filelist.name};
% remove '.' and '..' entries
filelist([strmatch('.',filelist,'exact');strmatch('..',filelist,'exact'))=[];
% or to ignore all hidden files, use filelist(strmatch('.',filelist))=[];
% prepend directory name to each filename entry, separated by filesep*
for f=1:length(filelist)
filelist{f}=[dirlist{d} filesep filelist{f}];
end
filenamelist=[filenamelist filelist];
end
filesep
MATLAB이 실행중인 플랫폼에 대한 디렉터리 구분 기호를 반환합니다.
그러면 셀형 배열 filenamelist 에 전체 경로가있는 파일 이름 목록이 제공 됩니다. 가장 좋은 해결책은 아닙니다.
genpath
것은 본질적으로 두 번 검색합니다.
private
가 있으면 포함되지 않습니다.
이것은 .mat
루트 폴더에 지정된 형식 (일반적으로 ) 으로 파일 이름을 가져 오는 편리한 기능입니다 !
function filenames = getFilenames(rootDir, format)
% Get filenames with specified `format` in given `foler`
%
% Parameters
% ----------
% - rootDir: char vector
% Target folder
% - format: char vector = 'mat'
% File foramt
% default values
if ~exist('format', 'var')
format = 'mat';
end
format = ['*.', format];
filenames = dir(fullfile(rootDir, format));
filenames = arrayfun(...
@(x) fullfile(x.folder, x.name), ...
filenames, ...
'UniformOutput', false ...
);
end
귀하의 경우 다음 스 니펫을 사용할 수 있습니다. :)
filenames = getFilenames('D:/dic/**');
for i = 1:numel(filenames)
filename = filenames{i};
% do your job!
end
거의 수정하지 않지만 거의 비슷한 접근 방식으로 각 하위 폴더의 전체 파일 경로를 가져옵니다.
dataFolderPath = 'UCR_TS_Archive_2015/';
dirData = dir(dataFolderPath); %# Get the data for the current directory
dirIndex = [dirData.isdir]; %# Find the index for directories
fileList = {dirData(~dirIndex).name}'; %'# Get a list of the files
if ~isempty(fileList)
fileList = cellfun(@(x) fullfile(dataFolderPath,x),... %# Prepend path to files
fileList,'UniformOutput',false);
end
subDirs = {dirData(dirIndex).name}; %# Get a list of the subdirectories
validIndex = ~ismember(subDirs,{'.','..'}); %# Find index of subdirectories
%# that are not '.' or '..'
for iDir = find(validIndex) %# Loop over valid subdirectories
nextDir = fullfile(dataFolderPath,subDirs{iDir}); %# Get the subdirectory path
getAllFiles = dir(nextDir);
for k = 1:1:size(getAllFiles,1)
validFileIndex = ~ismember(getAllFiles(k,1).name,{'.','..'});
if(validFileIndex)
filePathComplete = fullfile(nextDir,getAllFiles(k,1).name);
fprintf('The Complete File Path: %s\n', filePathComplete);
end
end
end