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


102

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

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

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

답변:


130

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

3
+1-훌륭한 솔루션입니다. 필요한지 모르겠지만 다음 줄을 삽입하면 : fileList = cellfun (@ (x) strcat ([dirName, '\'], x), fileList, 'UniformOutput', 0); 첫 번째 fileList 정의와 subDirs 정의 사이의 솔루션으로 각 파일의 전체 경로와 파일 이름을 반환합니다.
Doresoom 2010

2
@Doresoom : 좋은 제안입니다. 대신 FULLFILE을 사용했습니다. 파일 구분자 선택을 처리하기 때문입니다 (UNIX와 Windows에서는 다름). 또한 fileList = strcat(dirName,filesep,fileList);CELLFUN을 사용 하는 대신에 할 수 있지만, 그렇게하면 불필요한 파일 구분 기호를 추가로 사용할 수 있습니다. FULLFILE도 처리합니다.
gnovice 2010-04-16

2
@gnovice, @Doreseoom가 -에 따르면 mathworks.com/access/helpdesk/help/techdoc/ref/dir.html , 순서가 '디렉토리'를 반환하는 것은 OS 의존한다. 예를 들어 DOS DIRCMD 변수를 순서를 변경하는 것으로 설정하면 어떻게되는지 잘 모르겠습니다. Octave는 정상적으로 처리하지만 (. 및 ..이 여전히 첫 번째 임) 테스트 할 MATLAB이 없습니다.
mtrw 2010

2
@gnovice : 이것은 OP의 질문을 넘어서지 만 정규 표현식을 함수에 빌드하는 것이 유용하다는 것을 알았습니다. 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)(마지막 줄의 두 번째 줄에도 있음)
Peter D

1
감사합니다. 2 개의 추가 매개 변수를 지원하도록 코드를 정교화했습니다. stackoverflow.com/a/26449095/69555
Oz Radiano 2014 년

25

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

하위 디렉터리에있는 파일을 포함하지만 디렉터리 자체는 제외하고 재귀 적으로 검색 할 수 있습니까?
Gtker 2010

머릿속에서 벗어나지 않습니다. (더 이상 Matlab에 정기적으로 액세스 할 수 없습니다) 도움이 될 수 있습니다. mathworks.com/matlabcentral/fileexchange/…
James B

2
제외하는 방법 ...?
Gtker 2010

5
@Runner :. 그리고 .., dir의 출력에서 ​​처음 두 항목을 제거하십시오. 또는 특정 파일 유형을 찾는 경우 dir('*.ext')디렉토리를 자동으로 제외하는를 실행하십시오 (물론 .ext로 끝나지 않는 한)
Jonas

14

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

8

당신은 정규 표현식 사용하거나 제거하기 위해 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가 각 하위 디렉터리에 대해 빈 셀을 반환 할 때까지 각 하위 폴더를 계속 검색 할 수 있어야합니다.


@Runner : for 및 while 루프를 사용하면 작동하지만 지금은 구현하기가 게으 릅니다.
Doresoom 2010

+1은 질문에 정확히 답하지는 않지만 디렉토리를 신속하게 제거 할 수있는 방법을 제공합니다.
jhfrontz 2012 년

7

이 답변은 질문에 직접 답하지는 않지만 상자 밖에서 좋은 해결책이 될 수 있습니다.

나는 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파일 을 선택하기 위해 새로운 구문을 배우거나 재발 명 할 필요가 없습니다 .

부정:

  • 시스템 독립적이지 않습니다.
  • 구문 분석하기 어려울 수있는 단일 문자열에 의존합니다.

3

이것에 대한 단일 기능 방법을 모르지만 하위 디렉토리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것은 본질적으로 두 번 검색합니다.
Gtker 2010

2
GENPATH 사용의 한 가지 단점은 MATLAB 경로에서 허용되는 하위 디렉터리 만 포함한다는 것입니다. 예를 들어라는 디렉토리 private가 있으면 포함되지 않습니다.
gnovice

1

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

0

거의 수정하지 않지만 거의 비슷한 접근 방식으로 각 하위 폴더의 전체 파일 경로를 가져옵니다.

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  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.