[matlab] MATLAB의 특정 디렉터리에있는 모든 파일을 가져 오는 방법은 무엇입니까?

D:\dic개별적으로 추가 처리하려면 모든 파일을 아래로 가져 와서 반복해야합니다.

MATLAB은 이러한 종류의 작업을 지원합니까?

PHP, Python과 같은 다른 스크립트에서 수행 할 수 있습니다.



답변

업데이트 : 이 게시물이 꽤 오래되었고 그 기간 동안 내가 사용하기 위해이 유틸리티를 많이 수정했기 때문에 새 버전을 게시해야한다고 생각했습니다. 내 최신 코드는 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');


답변

디렉토리 내용을 반환 할 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: []


답변

이 훌륭한 답변에 언급 된 코드를 사용하고 제 경우에 필요한 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.

양:

  • 매우 빠릅니다 (제 경우에는 Linux에서 18000 파일 데이터베이스).
  • 잘 테스트 된 솔루션을 사용할 수 있습니다.
  • ie *.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 에 전체 경로가있는 파일 이름 목록이 제공 됩니다. 가장 좋은 해결책은 아닙니다.


답변

이것은 .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