Jawaban:
Pembaruan: Mengingat bahwa posting ini cukup lama, dan saya telah banyak memodifikasi utilitas ini untuk penggunaan saya sendiri selama waktu itu, saya pikir saya harus memposting versi baru. Kode terbaru saya dapat ditemukan di The MathWorks Berkas Efek : dirPlus.m
. Anda juga bisa mendapatkan sumbernya dari GitHub .
Saya membuat sejumlah perbaikan. Sekarang memberi Anda opsi untuk menambahkan jalur lengkap atau mengembalikan hanya nama file (digabungkan dari Doresoom dan Oz Radiano ) dan menerapkan pola ekspresi reguler ke nama file (digabungkan dari Peter D ). Selain itu, saya menambahkan kemampuan untuk menerapkan fungsi validasi ke setiap file, memungkinkan Anda memilihnya berdasarkan kriteria selain hanya namanya (yaitu ukuran file, konten, tanggal pembuatan, dll.).
CATATAN: Dalam versi MATLAB yang lebih baru (R2016b dan yang lebih baru), dir
fungsi tersebut memiliki kemampuan pencarian rekursif! Jadi, Anda dapat melakukan ini untuk mendapatkan daftar semua *.m
file di semua subfolder dari folder saat ini:
dirData = dir('**/*.m');
Berikut adalah fungsi yang mencari secara rekursif melalui semua subdirektori dari direktori tertentu, mengumpulkan daftar semua nama file yang ditemukannya:
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
Setelah menyimpan fungsi di atas di suatu tempat di jalur MATLAB Anda, Anda dapat memanggilnya dengan cara berikut:
fileList = getAllFiles('D:\dic');
fileList = strcat(dirName,filesep,fileList);
daripada menggunakan CELLFUN, meskipun Anda dapat berakhir dengan pemisah file ekstra yang tidak perlu dengan cara itu, yang juga ditangani oleh FULLFILE untuk Anda.
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
dan mengubah tanda tangan fungsi menjadi getAllFiles(dirName, pattern)
(juga di baris ke-2 hingga terakhir)
Anda mencari dir untuk mengembalikan isi direktori.
Untuk mengulang hasil, Anda cukup melakukan hal berikut:
dirlist = dir('.');
for i = 1:length(dirlist)
dirlist(i)
end
Ini akan memberi Anda keluaran dalam format berikut, misalnya:
name: 'my_file'
date: '01-Jan-2010 12:00:00'
bytes: 56
isdir: 0
datenum: []
.
dan ..
?
dir('*.ext')
, yang secara otomatis mengecualikan direktori (kecuali jika diakhiri dengan .ext, tentu saja)
Saya menggunakan kode yang disebutkan dalam jawaban hebat ini dan mengembangkannya untuk mendukung 2 parameter tambahan yang saya butuhkan dalam kasus saya. Parameternya adalah ekstensi file untuk difilter dan sebuah bendera yang menunjukkan apakah akan menggabungkan jalur lengkap ke nama file atau tidak.
Saya harap ini cukup jelas dan seseorang akan merasakan manfaatnya.
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
Contoh untuk menjalankan kode:
fileList = getAllFiles(dirName, '*.xml', 0); %#0 is false obviously
Anda dapat menggunakan regexp atau strcmp untuk menghilangkan .
dan ..
Atau Anda dapat menggunakan isdir
field jika Anda hanya ingin file dalam direktori, bukan folder.
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
atau gabungkan dua baris terakhir:
filenames={list(~[list.isdir]).name};
Untuk daftar folder di direktori tidak termasuk. dan ..
dirnames={list([list.isdir]).name};
dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',dirnames)));
Dari titik ini, Anda harus bisa melempar kode ke loop for bersarang, dan terus mencari setiap subfolder sampai dirnames Anda mengembalikan sel kosong untuk setiap subdirektori.
Jawaban ini tidak langsung menjawab pertanyaan tetapi mungkin merupakan solusi yang baik di luar kotak.
Saya memberi suara positif pada solusi gnovice, tetapi ingin menawarkan solusi lain: Gunakan perintah yang bergantung pada sistem dari sistem operasi Anda:
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.
Positif:
*.wav
file ie .Negatif:
Saya tidak tahu metode satu fungsi untuk ini, tetapi Anda hanya dapat menggunakan genpath
daftar subdirektori untuk mengulang . Daftar ini dikembalikan sebagai string direktori yang dipisahkan titik koma, jadi Anda harus memisahkannya menggunakan strread, yaitu
dirlist = strread(genpath('/path/of/directory'),'%s','delimiter',';')
Jika Anda tidak ingin menyertakan direktori yang diberikan, hapus entri pertama dirlist
, yaitu dirlist(1)=[];
karena ini selalu merupakan entri pertama.
Kemudian dapatkan daftar file di setiap direktori dengan loop 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
mengembalikan pemisah direktori untuk platform yang menjalankan MATLAB.
Ini memberi Anda daftar nama file dengan jalur lengkap dalam daftar file array sel . Bukan solusi yang paling rapi, saya tahu.
genpath
, itu pada dasarnya mencari dua kali.
private
, direktori tersebut tidak akan disertakan.
Ini adalah fungsi praktis untuk mendapatkan nama file, dengan format yang ditentukan (biasanya .mat
) di folder root!
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
Dalam kasus Anda, Anda dapat menggunakan cuplikan berikut :)
filenames = getFilenames('D:/dic/**');
for i = 1:numel(filenames)
filename = filenames{i};
% do your job!
end
Dengan sedikit modifikasi tetapi pendekatan yang hampir mirip untuk mendapatkan path file lengkap dari setiap sub folder
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