উত্তর:
আপডেট: এই পোস্টটি বেশ পুরানো এবং এই সময়কালে আমি আমার নিজের ব্যবহারের জন্য এই ইউটিলিটিটি অনেকটা পরিবর্তন করেছি, ভেবেছিলাম আমার একটি নতুন সংস্করণ পোস্ট করা উচিত। আমার নতুন কোড পাওয়া যাবে 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');
fileList = strcat(dirName,filesep,fileList);
সেলফুন ব্যবহার করার পরিবর্তে এটি করতে পারেন, যদিও আপনি অতিরিক্ত অপ্রয়োজনীয় ফাইল বিভাজকগুলি শেষ করতে পারেন, যা ফুলফায়ালও আপনার যত্ন নেয়।
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)
(দ্বিতীয় থেকে শেষ লাইনেও)
আপনি ডিরেক্টরি বিষয়বস্তু ফিরে পেতে 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: []
.
এবং ..
?
dir('*.ext')
, যা স্বয়ংক্রিয়ভাবে ডিরেক্টরিগুলি বাদ দেয় (যদি না তারা অবশ্যই শেষ হয়)
আমি এই দুর্দান্ত উত্তরে উল্লিখিত কোডটি ব্যবহার করেছি এবং আমার ক্ষেত্রে আমার প্রয়োজন আরও ২ টি অতিরিক্ত পরামিতি সমর্থন করার জন্য এটি প্রসারিত করেছি। পরামিতিগুলি ফিল্টার করার জন্য ফাইল এক্সটেনশান এবং একটি পতাকা ফাইলের নামের পুরো পথটি সম্মতিযুক্ত কিনা তা নির্দেশ করে।
আমি আশা করি এটি যথেষ্ট পরিষ্কার এবং কেউ এটিকে উপকারী বলে মনে করবেন।
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)));
এই বিন্দু থেকে আপনার কোডটি লুপের জন্য নেস্টেডে ফেলে দিতে সক্ষম হওয়া উচিত এবং প্রতিটি সাব-ফোল্ডার অনুসন্ধান করা চালিয়ে যাওয়া অব্যাহত থাকবে যতক্ষণ না আপনার ডায়ারনেমগুলি প্রতিটি উপ-ডিরেক্টরিতে খালি ঘর না ফেরায়।
এই উত্তরটি সরাসরি প্রশ্নের উত্তর দেয় না তবে এটি বক্সের বাইরে একটি ভাল সমাধান হতে পারে।
আমি জিনোভাইসের সমাধানটি উন্নত করেছিলাম, তবে অন্য একটি সমাধান দিতে চাই: আপনার অপারেটিং সিস্টেমের সিস্টেম নির্ভর কমান্ডটি ব্যবহার করুন:
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
যে প্ল্যাটফর্মটিতে ম্যাটল্যাব চলছে তার জন্য ডিরেক্টরি বিভাজকটি ফেরৎ দেয়।
এটি আপনাকে সেল অ্যারে ফাইলের তালিকায় পুরো পাথ সহ ফাইলের নামের একটি তালিকা দেয় । সবচেয়ে কাছের সমাধান নয়, আমি জানি।
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