Ich muss all diese Dateien untergehen D:\dic
und sie durchlaufen, um sie einzeln weiter zu verarbeiten.
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 Dienstprogramm in dieser Zeit stark für meinen eigenen Gebrauch geändert habe, dachte ich, ich sollte eine neue Version veröffentlichen. Mein neuester Code ist in The MathWorks File Exchange zu finden : dirPlus.m
. Sie können die Quelle auch von GitHub erhalten .
Ich habe einige Verbesserungen vorgenommen. Sie haben jetzt die Möglichkeit, den vollständigen Pfad voranzustellen oder nur den Dateinamen (von Doresoom und Oz Radiano übernommen ) zurückzugeben und den Dateinamen (von Peter D übernommen ) ein Muster mit regulären Ausdrücken zuzuweisen . Darüber hinaus habe ich die Möglichkeit hinzugefügt, auf jede Datei eine Validierungsfunktion anzuwenden, mit der Sie sie anhand anderer Kriterien als nur ihrer Namen (z. B. Dateigröße, Inhalt, Erstellungsdatum usw.) auswählen können.
HINWEIS: In neueren Versionen von MATLAB (R2016b und höher) verfügt die dir
Funktion über rekursive Suchfunktionen! So können Sie eine Liste aller *.m
Dateien in allen Unterordnern des aktuellen Ordners abrufen:
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');
fileList = strcat(dirName,filesep,fileList);
CELLFUN verwenden, obwohl Sie auf diese Weise zusätzliche unnötige Dateitrennzeichen erhalten können, die FULLFILE auch für Sie erledigt.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
und ändern Sie die Funktionssignatur ingetAllFiles(dirName, pattern)
(auch in der 2. bis letzten Zeile)Sie suchen nach dir , um den Verzeichnisinhalt zurückzugeben.
Um die Ergebnisse zu durchlaufen, können Sie einfach Folgendes tun:
Dies sollte Ihnen eine Ausgabe im folgenden Format geben, z.
quelle
.
und..
?dir('*.ext')
, wodurch Verzeichnisse automatisch ausgeschlossen werden (es sei denn, sie enden natürlich mit .ext)Ich habe den in dieser großartigen Antwort erwähnten Code verwendet und ihn erweitert, um 2 zusätzliche Parameter zu unterstützen, die ich in meinem Fall benötigte. Die Parameter sind Dateierweiterungen, nach denen gefiltert werden soll, und ein Flag, das angibt, ob der vollständige Pfad zum Namen der Datei verkettet werden soll oder nicht.
Ich hoffe, es ist klar genug und jemand wird es nützlich finden.
Beispiel für die Ausführung des Codes:
quelle
Sie können Regexp oder Strcmp verwenden, um zu entfernen,
.
und..
Sie können dasisdir
Feld auch verwenden, wenn Sie nur Dateien im Verzeichnis und keine Ordner möchten.oder kombinieren Sie die letzten beiden Zeilen:
Für eine Liste der Ordner im Verzeichnis ausgenommen. und ..
Ab diesem Punkt sollten Sie in der Lage sein, den Code in eine verschachtelte for-Schleife zu werfen und jeden Unterordner weiter zu durchsuchen, bis Ihre Verzeichnisnamen eine leere Zelle für jedes Unterverzeichnis zurückgeben.
quelle
Diese Antwort beantwortet die Frage nicht direkt, kann aber eine gute Lösung sein.
Ich habe die Lösung von gnovice verbessert, möchte aber eine andere Lösung anbieten: Verwenden Sie den systemabhängigen Befehl Ihres Betriebssystems:
Positiv:
*.wav
Dateien auszuwählen .Negativ:
quelle
Ich kenne hierfür keine Einzelfunktionsmethode, aber Sie können
genpath
nur eine Liste von Unterverzeichnissen verwenden . Diese Liste wird als durch Semikolons 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
, dh,dirlist(1)=[];
es ist immer der erste Eintrag.Rufen Sie dann die Liste der Dateien in jedem Verzeichnis mit einer Schleife ab
dir
.filesep
Gibt das Verzeichnistrennzeichen für die Plattform zurück, auf der MATLAB ausgeführt wird.Auf diese Weise erhalten Sie eine Liste von Dateinamen mit vollständigen Pfaden im Zellenarray- Dateinamellisten . Nicht die sauberste Lösung, ich weiß.
quelle
genpath
, es wird im Wesentlichen zweimal gesucht.private
, werden diese nicht berücksichtigt.Dies ist eine praktische Funktion zum Abrufen von Dateinamen mit dem angegebenen Format (normalerweise
.mat
) in einem Stammordner!In Ihrem Fall können Sie das folgende Snippet verwenden :)
quelle
Mit wenig Modifikation, aber fast ähnlichem Ansatz, um den vollständigen Dateipfad jedes Unterordners zu erhalten
quelle