Ich muss all diese Dateien unter D:\dic
finden und sie einzeln ablaufen lassen.
Unterstützt MATLAB diese Art von Operationen?
Es kann in anderen Skripten wie PHP, Python ...
Update: Da dieser Beitrag ziemlich alt ist und ich dieses Hilfsprogramm in dieser Zeit für meinen eigenen Gebrauch modifiziert habe, dachte ich, ich sollte eine neue Version veröffentlichen. Mein neuester Code kann unter The MathWorks File Exchange : dirPlus.m
gefunden werden. Sie können die Quelle auch von GitHub erhalten.
Ich habe einige Verbesserungen vorgenommen. Jetzt haben Sie die Möglichkeit, den vollständigen Pfad voranzustellen oder nur den Dateinamen zurückzugeben (integriert aus Doresoom und Oz Radiano ) und den Dateinamen ein reguläres Ausdrucksmuster zuzuweisen (eingebaut aus Peter D ). Außerdem habe ich die Möglichkeit hinzugefügt, eine Validierungsfunktion auf jede Datei anzuwenden, sodass Sie sie anhand von anderen Kriterien als nur nach ihrem Namen (d. H. Dateigröße, Inhalt, Erstellungsdatum usw.) auswählen können.
HINWEIS: In neueren Versionen von MATLAB (R2016b und höher) verfügt die Funktion dir
über rekursive Suchfunktionen! So können Sie eine Liste aller *.m
-Dateien in allen Unterordnern des aktuellen Ordners erhalten:
dirData = dir('**/*.m');
Hier ist eine Funktion, die rekursiv alle Unterverzeichnisse eines bestimmten Verzeichnisses durchsucht und eine Liste aller gefundenen Dateinamen sammelt:
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
Nachdem Sie die obige Funktion irgendwo in Ihrem MATLAB-Pfad gespeichert haben, können Sie sie folgendermaßen aufrufen:
fileList = getAllFiles('D:\dic');
Sie suchen nach dir , um den Inhalt des Verzeichnisses zurückzugeben.
Um die Ergebnisse zu wiederholen, können Sie einfach Folgendes tun:
dirlist = dir('.');
for i = 1:length(dirlist)
dirlist(i)
end
Dadurch sollten Sie die Ausgabe im folgenden Format erhalten, z. B .:
name: 'my_file'
date: '01-Jan-2010 12:00:00'
bytes: 56
isdir: 0
datenum: []
Ich habe den in this great answer erwähnten Code verwendet und ihn erweitert, um 2 zusätzliche Parameter zu unterstützen, die ich in meinem Fall brauchte. Die Parameter sind Dateierweiterungen zum Filtern und ein Flag, das angibt, ob der vollständige Pfad mit dem Dateinamen verkettet werden soll oder nicht.
Ich hoffe es ist klar genug und jemand wird es für nützlich halten.
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
Beispiel zum Ausführen des Codes:
fileList = getAllFiles(dirName, '*.xml', 0); %#0 is false obviously
Sie können regexp oder strcmp verwenden, um .
und ..
.__ zu entfernen. Sie können auch das Feld isdir
verwenden, wenn Sie nur Dateien im Verzeichnis und keine Ordner möchten.
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
oder kombiniere die letzten beiden Zeilen:
filenames={list(~[list.isdir]).name};
Für eine Liste der Ordner im Verzeichnis mit Ausnahme. und ..
dirnames={list([list.isdir]).name};
dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',dirnames)));
Ab diesem Zeitpunkt sollten Sie in der Lage sein, den Code in einer verschachtelten for-Schleife zu werfen und die Suche nach jedem Unterordner fortzusetzen, bis Ihre Verzeichnisse eine leere Zelle für jedes Unterverzeichnis zurückgeben.
Diese Antwort beantwortet die Frage nicht direkt, kann aber außerhalb des Kastens eine gute Lösung sein.
Ich habe die Lösung von gnovice aktualisiert, möchte aber eine andere Lösung anbieten: Verwenden Sie den systemabhängigen Befehl Ihres Betriebssystems:
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.
Positiv:
*.wav
-Dateien auszuwählen.Negativ:
Ich kenne keine Einzelfunktionsmethode dafür, aber Sie können genpath
verwenden, um eine Liste von nur Unterverzeichnisse zu rekursivieren. Diese Liste wird als durch Semikolon getrennte Zeichenfolge von Verzeichnissen zurückgegeben, sodass Sie sie mit strread trennen müssen, d. H.
dirlist = strread(genpath('/path/of/directory'),'%s','delimiter',';')
Wenn Sie das angegebene Verzeichnis nicht einschließen möchten, entfernen Sie den ersten Eintrag von dirlist
, d. H. dirlist(1)=[];
, da dies immer der erste Eintrag ist.
Holen Sie sich dann die Liste der Dateien in jedem Verzeichnis mit einer Schleife 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
gibt das Verzeichnis-Trennzeichen für die Plattform zurück, auf der MATLAB ausgeführt wird.
Dies gibt Ihnen eine Liste von Dateinamen mit vollständigen Pfaden im Zellenarray Dateiliste. Ich weiß, dass dies nicht die sauberste Lösung ist.
Dies ist eine praktische Funktion zum Abrufen von Dateinamen mit dem angegebenen Format (normalerweise .mat
) in einem Stammverzeichnis.
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
In Ihrem Fall können Sie den folgenden Ausschnitt verwenden :)
filenames = getFilenames('D:/dic/**');
for i = 1:numel(filenames)
filename = filenames{i};
% do your job!
end
Mit wenig Modifikation aber fast gleichem Ansatz erhalten Sie den vollständigen Dateipfad jedes Unterordners
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