এমএটিএলবি-তে একটি নির্দিষ্ট ডিরেক্টরিতে সমস্ত ফাইল কীভাবে পাবেন?


102

D:\dicস্বতন্ত্রভাবে আরও প্রক্রিয়া করার জন্য আমার এই ফাইলগুলি অন্তর্ভুক্ত করা উচিত এবং সেগুলি লুপ করা দরকার।

ম্যাটল্যাব কি এই জাতীয় ক্রিয়াকলাপ সমর্থন করে?

এটি পিএইচপি, পাইথনের মতো অন্যান্য স্ক্রিপ্টগুলিতে করা যেতে পারে ...

উত্তর:


130

আপডেট: এই পোস্টটি বেশ পুরানো এবং এই সময়কালে আমি আমার নিজের ব্যবহারের জন্য এই ইউটিলিটিটি অনেকটা পরিবর্তন করেছি, ভেবেছিলাম আমার একটি নতুন সংস্করণ পোস্ট করা উচিত। আমার নতুন কোড পাওয়া যাবে MathWorks ফাইল বিনিময় : dirPlus.m। আপনি গিটহাব থেকে উত্সটিও পেতে পারেন ।

আমি অনেক উন্নতি করেছি। এটি এখন আপনাকে পুরো পথটি প্রিপেন্ড করতে বা কেবল ফাইলের নাম ( ডোরসুম এবং ওজ রাদিয়ানো থেকে অন্তর্ভুক্ত) ফিরিয়ে দেওয়ার এবং ফাইলের নামগুলিতে নিয়মিত অভিব্যক্তি প্যাটার্ন প্রয়োগ করতে ( পিটার ডি থেকে অন্তর্ভুক্ত) প্রয়োগ করার বিকল্প দেয় । তদতিরিক্ত, আমি প্রতিটি ফাইলটিতে একটি বৈধতা ফাংশন প্রয়োগ করার ক্ষমতা যুক্ত করেছি, আপনাকে কেবল তাদের নামগুলি (যেমন ফাইলের আকার, সামগ্রী, তৈরির তারিখ ইত্যাদি) ব্যতীত অন্যান্য মানদণ্ডের ভিত্তিতে সেগুলি নির্বাচন করার অনুমতি দিয়েছি।


দ্রষ্টব্য: ম্যাটল্যাবের নতুন সংস্করণগুলিতে (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

উপরের ফাংশনটি আপনার ম্যাটল্যাব পথে কোথাও সংরক্ষণ করার পরে, আপনি নিম্নলিখিত উপায়ে এটি কল করতে পারেন:

fileList = getAllFiles('D:\dic');

3
+1 - দুর্দান্ত সমাধান। এটি প্রয়োজনীয় কিনা আমি জানি না তবে আপনি যদি লাইনটি প্রবেশ করান: ফাইললিস্ট = সেলফুন (@ (এক্স) স্ট্রিকাট ([ডায়ারনাম, '\'], এক্স)), ফাইললিস্ট, 'ইউনিফর্মআউটপুট', 0); প্রথম ফাইললিস্ট সংজ্ঞা এবং সাবডিরস সংজ্ঞা মধ্যে আপনার সমাধান মধ্যে, এটি প্রতিটি ফাইলের জন্য পুরো পথ এবং ফাইলের নাম ফিরিয়ে দেবে।
ডোরেসুম

2
@ ডোরসুম: ভাল পরামর্শ, যদিও আমি এর পরিবর্তে ফুলফিল ব্যবহার করতে গিয়েছি, যেহেতু এটি আপনার জন্য ফাইল বিভাজকের পছন্দ পরিচালনা করে (যা ইউনিক্স এবং উইন্ডোজ থেকে আলাদা)। এছাড়াও, আপনি কেবল fileList = strcat(dirName,filesep,fileList);সেলফুন ব্যবহার করার পরিবর্তে এটি করতে পারেন, যদিও আপনি অতিরিক্ত অপ্রয়োজনীয় ফাইল বিভাজকগুলি শেষ করতে পারেন, যা ফুলফায়ালও আপনার যত্ন নেয়।
জিনোভাইস

2
@gnovice, @Doreseoom - মতে mathworks.com/access/helpdesk/help/techdoc/ref/dir.html , যাতে যে 'dir' এই আয় ওএস নির্ভরশীল। আমি নিশ্চিত না কী হয় তবে উদাহরণস্বরূপ, আপনি ডস ডিআরসিএমডি ভেরিয়েবলটিকে এমন কিছুতে সেট করে যা ক্রম পরিবর্তন করে। অক্টাভা এটি হ্যান্ডেল করে ঠিক আছে (এবং .. এখনও প্রথম) তবে আমার কাছে পরীক্ষার জন্য ম্যাটল্যাব নেই।
mtrw

2
@ জ্ঞানভোজন: এটি ওপি-র প্রশ্নের বাইরে নয়, তবে আমি ফাংশনটিতে নিয়মিত প্রকাশের পক্ষে এটি দরকারী বলে মনে করি। 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
অজ Radiano

25

আপনি ডিরেক্টরি বিষয়বস্তু ফিরে পেতে dir খুঁজছেন ।

ফলাফলগুলি লুপ করতে, আপনি কেবল নিম্নলিখিতটি করতে পারেন:

dirlist = dir('.');
for i = 1:length(dirlist)
    dirlist(i)
end

এটি আপনাকে নিম্নলিখিত ফর্ম্যাটটিতে আউটপুট দেয় should

name: 'my_file'
date: '01-Jan-2010 12:00:00'
bytes: 56
isdir: 0
datenum: []

আপনি কি এটিকে উপ-ডিরেক্টরিতে অন্তর্ভুক্ত ফাইলগুলি ডিরেক্টরি অন্তর্ভুক্ত বাদ দিয়ে পুনরায় অনুসন্ধান করতে পারবেন?
Gtker

আমার মাথার উপরের অংশটি
জেমস বি

2
কিভাবে বাদ .এবং ..?
Gtker

5
@ রুনার: বাদ দিতে। এবং .., dir আউটপুট প্রথম দুটি এন্ট্রি সরান। অথবা, আপনি যদি কোনও নির্দিষ্ট ফাইল প্রকারের সন্ধান করেন, চালান dir('*.ext'), যা স্বয়ংক্রিয়ভাবে ডিরেক্টরিগুলি বাদ দেয় (যদি না তারা অবশ্যই শেষ হয়)
জোনাস

14

আমি এই দুর্দান্ত উত্তরে উল্লিখিত কোডটি ব্যবহার করেছি এবং আমার ক্ষেত্রে আমার প্রয়োজন আরও ২ টি অতিরিক্ত পরামিতি সমর্থন করার জন্য এটি প্রসারিত করেছি। পরামিতিগুলি ফিল্টার করার জন্য ফাইল এক্সটেনশান এবং একটি পতাকা ফাইলের নামের পুরো পথটি সম্মতিযুক্ত কিনা তা নির্দেশ করে।

আমি আশা করি এটি যথেষ্ট পরিষ্কার এবং কেউ এটিকে উপকারী বলে মনে করবেন।

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)));

এই বিন্দু থেকে আপনার কোডটি লুপের জন্য নেস্টেডে ফেলে দিতে সক্ষম হওয়া উচিত এবং প্রতিটি সাব-ফোল্ডার অনুসন্ধান করা চালিয়ে যাওয়া অব্যাহত থাকবে যতক্ষণ না আপনার ডায়ারনেমগুলি প্রতিটি উপ-ডিরেক্টরিতে খালি ঘর না ফেরায়।


@ রুনার: আপনি যদি লুপগুলির জন্য এবং কিছু ব্যবহার করেন তবে এটি করে ... তবে আমি এখনই এটি বাস্তবায়নে অলসতা বজায় রেখেছি।
ডোরেসুম

+1 যদিও এটি প্রশ্নের সঠিক উত্তর দেয় না, এটি ডিরেক্টরিগুলি দ্রুত সরিয়ে দেওয়ার একটি উপায় সরবরাহ করে।
jhfrontz

7

এই উত্তরটি সরাসরি প্রশ্নের উত্তর দেয় না তবে এটি বক্সের বাইরে একটি ভাল সমাধান হতে পারে।

আমি জিনোভাইসের সমাধানটি উন্নত করেছিলাম, তবে অন্য একটি সমাধান দিতে চাই: আপনার অপারেটিং সিস্টেমের সিস্টেম নির্ভর কমান্ডটি ব্যবহার করুন:

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 যে প্ল্যাটফর্মটিতে ম্যাটল্যাব চলছে তার জন্য ডিরেক্টরি বিভাজকটি ফেরৎ দেয়।

এটি আপনাকে সেল অ্যারে ফাইলের তালিকায় পুরো পাথ সহ ফাইলের নামের একটি তালিকা দেয় । সবচেয়ে কাছের সমাধান নয়, আমি জানি।


পারফরম্যান্স কারণে আমি চাই না genpath, এটি মূলত দু'বার অনুসন্ধান করে।
Gtker

2
GENPATH ব্যবহারের ক্ষেত্রে একটি অসুবিধা হ'ল এটিতে কেবল সাব-ডাইরেক্টরিগুলি অন্তর্ভুক্ত থাকবে যা ম্যাটল্যাব পথে অনুমোদিত allowed উদাহরণস্বরূপ, যদি আপনার ডিরেক্টরিতে ডিরেক্টরি থাকে তবে privateসেগুলি অন্তর্ভুক্ত করা হবে না।
জিনোভাইস

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.