MATLABの特定のディレクトリにあるすべてのファイルを取得するにはどうすればよいですか?


102

これらすべてのファイルを取得する必要があります D:\dicループし、個別にさらに処理。

MATLABはこの種の操作をサポートしていますか?

PHP、Pythonなどの他のスクリプトで実行できます...

回答:


130

更新:この投稿はかなり古く、その間私は自分自身が使用できるようにこのユーティリティを大幅に変更したので、新しいバージョンを投稿する必要があると思いました。最新のコードは、MathWorks File ExchangeにありますdirPlus.mGitHubからソースを取得することもできます

私はいくつかの改善を行いました。フルパスを付加するか、ファイル名のみを返すオプション(DoresoomOz 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

2
@gnovice、@Doreseoomは-することによりmathworks.com/access/helpdesk/help/techdoc/ref/dir.html、順番「DIR」を返すことは、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)(2行目から最後の行でも)に変更します
Peter D

1
ありがとうございます。2つの追加パラメーターをサポートするようにコードを作成しました-stackoverflow.com/a/26449095/69555
Oz Radiano

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

私の頭の上から、なし(私はもはやMatlabのに定期的にアクセスを持っていない)が、これはあなたを助けるかもしれない:mathworks.com/matlabcentral/fileexchange/...
ジェームズB

2
除外する方法...
Gtker

5
@Runner:除外します。および..、dirの出力の最初の2つのエントリを削除します。または、特定のファイルタイプを探している場合は、を実行します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

regexpまたは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

または、最後の2行を結合します。

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、基本的に2回検索したくありません。
Gtker

2
GENPATHを使用する場合の1つの欠点は、MATLABパスで許可されているサブディレクトリしか含まれないことです。たとえば、という名前のディレクトリがある場合private、それらは含まれません。
gnovice 2010

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.