MATLAB में एक विशेष निर्देशिका के तहत सभी फाइलें कैसे प्राप्त करें?


102

मुझे D:\dicव्यक्तिगत रूप से आगे की प्रक्रिया के लिए उन सभी फाइलों को अंडर और लूप करने की आवश्यकता है ।

MATLAB इस तरह के संचालन का समर्थन करता है?

यह PHP, पायथन जैसी अन्य लिपियों में किया जा सकता है ...

जवाबों:


130

अपडेट: यह देखते हुए कि यह पद काफी पुराना है, और मैंने इस उपयोगिता को उस समय के दौरान अपने स्वयं के उपयोग के लिए संशोधित किया है, मुझे लगा कि मुझे एक नया संस्करण पोस्ट करना चाहिए। मेरे नवीनतम कोड पर पाया जा सकता 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');

3
+1 - महान समाधान। मुझे नहीं पता कि यह आवश्यक है, लेकिन यदि आप लाइन डालें: fileList = cellfun (@ (x) strcat ([dirName, '\'], x), fileList, 'UniformOutput', 0); पहली फ़ाइललिस्ट परिभाषा और उप-परिभाषा परिभाषा के बीच आपके समाधान में, यह प्रत्येक फ़ाइल के लिए पूर्ण पथ और फ़ाइल नाम लौटाएगा।
Doresoom

2
@ डोरसम: अच्छा सुझाव है, हालांकि मैं इसके बजाय फुलस्मेर का उपयोग कर रहा हूं, क्योंकि यह आपके लिए फ़ाइल विभाजक की पसंद को संभालता है (जो कि यूनिक्स और विंडोज पर अलग है)। इसके अलावा, आप fileList = strcat(dirName,filesep,fileList);CELLFUN का उपयोग करने के बजाय बस कर सकते हैं, हालांकि आप उस तरह से अतिरिक्त अनावश्यक फ़ाइल विभाजकों के साथ समाप्त कर सकते हैं, जो फुलइज़र भी आपकी देखभाल करता है।
gnovice

2
@gnovice, @Doreseoom - mathworks.com/access/helpdesk/help/techdoc/ref/dir.html के अनुसार , 'dir' रिटर्न का क्रम OS पर निर्भर है। मुझे यकीन नहीं है कि क्या होता है यदि, उदाहरण के लिए, आप डॉस DIRCMD चर को आदेश में परिवर्तन करने वाली किसी चीज़ पर सेट करते हैं। ऑक्टेव इसे संभालता है ठीक है (और .. अभी भी पहले हैं) लेकिन मेरे पास परीक्षण करने के लिए MATLAB नहीं है।
mtrw

2
@gnovice: यह ओपी के प्रश्न से परे है, लेकिन मैंने इसे समारोह में नियमित अभिव्यक्ति के निर्माण के लिए उपयोगी पाया। 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)(दूसरी से अंतिम पंक्ति में भी) परिवर्तित करें
पीटर डी

1
शानदार जवाब, धन्यवाद! मैंने 2 अतिरिक्त मापदंडों का समर्थन करने के लिए कोड को विस्तृत किया है - stackoverflow.com/a/26449095/69555
Oz रेडियानो

25

आप देख रहे हैं निर्देशिका निर्देशिका सामग्री वापस जाने के लिए।

परिणामों पर लूप करने के लिए, आप बस निम्नलिखित कार्य कर सकते हैं:

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: []

क्या आप इसे पुन: खोज कर सकते हैं जिसमें उपनिर्देशिकाओं में फाइलें शामिल हैं लेकिन निर्देशिका को छोड़कर?
13

: नहीं मेरे सिर के ऊपर से, कोई (मैं अब मैटलैब लिए नियमित रूप से उपयोग कर सकते है), लेकिन यह आपको मदद मिल सकती mathworks.com/matlabcentral/fileexchange/...
जेम्स बी

2
बाहर कैसे करें .और ..?
Gtker

5
@ रनर: बाहर करना। और .., dir के आउटपुट में पहले दो प्रविष्टियाँ निकालें। या, यदि आप एक विशिष्ट फ़ाइल प्रकार की तलाश कर रहे हैं, तो चलाएं dir('*.ext'), जो स्वचालित रूप से निर्देशिकाओं को बाहर कर देता है (जब तक कि वे .ext, बिल्कुल नहीं)
जोनास

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

या अंतिम दो लाइनों को मिलाएं:

filenames={list(~[list.isdir]).name};

छोड़कर निर्देशिका में फ़ोल्डरों की सूची के लिए। तथा ..

dirnames={list([list.isdir]).name};
dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',dirnames)));

इस बिंदु से, आपको कोड को लूप के लिए नेस्टेड में फेंकने में सक्षम होना चाहिए, और प्रत्येक सबफ़ोल्डर को तब तक खोजते रहना चाहिए जब तक कि आपका डायरनेम प्रत्येक उपनिर्देशिका के लिए एक खाली सेल न लौटा दे।


@ रनर: यह तब होता है जब आप कुछ का उपयोग करते हैं और लूप करते हैं ... लेकिन मैं अभी उस पर अमल करने के लिए आलसी हूं।
15

+1 भले ही यह सवाल का सही जवाब नहीं देता है, लेकिन यह निर्देशिकाओं को जल्दी से बाहर निकालने का एक तरीका प्रदान करता है।
झर्ज़्ज़

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.

सकारात्मक:

  • बहुत तेज (लिनक्स पर 18000 फाइलों के डेटाबेस के लिए मेरे मामले में)।
  • आप अच्छी तरह से परीक्षण किए गए समाधानों का उपयोग कर सकते हैं।
  • आपको *.wavफ़ाइलों को चुनने के लिए एक नया सिंटैक्स सीखने या पुन: स्थापित करने की आवश्यकता नहीं है ।

नकारात्मक:

  • आप सिस्टम से स्वतंत्र नहीं हैं।
  • आप एक एकल स्ट्रिंग पर भरोसा करते हैं जो पार्स करना मुश्किल हो सकता है।

3

मुझे इसके लिए एकल-फ़ंक्शन विधि का पता नहीं है, लेकिन आप केवल उपनिर्देशिकाओं की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, यह अनिवार्य रूप से दो बार खोज करता है।
Gtker

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  
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.