जवाबों:
अपडेट: यह देखते हुए कि यह पद काफी पुराना है, और मैंने इस उपयोगिता को उस समय के दौरान अपने स्वयं के उपयोग के लिए संशोधित किया है, मुझे लगा कि मुझे एक नया संस्करण पोस्ट करना चाहिए। मेरे नवीनतम कोड पर पाया जा सकता MathWorks फ़ाइल एक्सचेंज : dirPlus.m
। आप गीथहब से स्रोत भी प्राप्त कर सकते हैं ।
मैंने कई सुधार किए। अब यह आपको पूर्ण पथ को प्रस्तुत करने या बस फ़ाइल नाम ( डोरसूम और ओज़ रेडियानो से शामिल ) वापस करने का विकल्प देता है और फ़ाइल नामों ( पीटर डी से शामिल) के लिए एक नियमित अभिव्यक्ति पैटर्न लागू करता है । इसके अलावा, मैंने प्रत्येक फ़ाइल में एक मान्यता फ़ंक्शन लागू करने की क्षमता को जोड़ा, जिससे आप उन्हें केवल उनके नाम (यानी फ़ाइल आकार, सामग्री, निर्माण तिथि, आदि) के अलावा अन्य मानदंडों के आधार पर चुन सकते हैं।
नोट: 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 का उपयोग करने के बजाय बस कर सकते हैं, हालांकि आप उस तरह से अतिरिक्त अनावश्यक फ़ाइल विभाजकों के साथ समाप्त कर सकते हैं, जो फुलइज़र भी आपकी देखभाल करता है।
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)
(दूसरी से अंतिम पंक्ति में भी) परिवर्तित करें
आप देख रहे हैं निर्देशिका निर्देशिका सामग्री वापस जाने के लिए।
परिणामों पर लूप करने के लिए, आप बस निम्नलिखित कार्य कर सकते हैं:
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
या अंतिम दो लाइनों को मिलाएं:
filenames={list(~[list.isdir]).name};
छोड़कर निर्देशिका में फ़ोल्डरों की सूची के लिए। तथा ..
dirnames={list([list.isdir]).name};
dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',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
सूची का पुन: उपयोग करने के लिए उपयोग कर सकते हैं । यह सूची निर्देशिकाओं के अर्धविराम-सीमांकित स्ट्रिंग के रूप में वापस आ गई है, इसलिए आपको स्ट्रैड का उपयोग करके इसे अलग करना होगा, अर्थात
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 जिस प्लेटफ़ॉर्म पर चल रहा है, उसके लिए निर्देशिका विभाजक लौटाता है।
यह आपको सेल एरे फाइलनामेलिस्ट में पूर्ण पथ के साथ फ़ाइल नाम की सूची देता है । सबसे साफ समाधान नहीं, मुझे पता है।
genpath
, यह अनिवार्य रूप से दो बार खोज करता है।
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