回答:
更新:この投稿はかなり古く、その間私は自分自身が使用できるようにこのユーティリティを大幅に変更したので、新しいバージョンを投稿する必要があると思いました。最新のコードは、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)
(2行目から最後の行でも)に変更します
ディレクトリの内容を返す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
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が各サブディレクトリの空のセルを返すまで、各サブフォルダーの検索を続けることができるはずです。
この回答は質問に直接回答するものではありませんが、すぐに使える優れた解決策になる場合があります。
私は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
、基本的に2回検索したくありません。
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