Comment obtenir tous les fichiers sous un répertoire spécifique dans MATLAB?
8 réponses
mise à Jour: étant Donné que ce post est assez ancien, et j'ai modifié cet utilitaire beaucoup pour mon propre usage pendant ce temps, j'ai pensé que je devrais poster une nouvelle version. Mon code le plus récent se trouve sur The MathWorks File Exchange : dirPlus.m
. Vous pouvez également obtenir la source de GitHub .
j'ai fait un certain nombre d'améliorations. Il vous donne maintenant des options pour préparer le plein chemin d'accès ou de retour juste le nom du fichier (constituée de Doresoom et Oz Radiano ) et d'appliquer un modèle d'expression régulière pour les noms de fichier (constituée de Pierre D ). En outre, j'ai ajouté la possibilité d'appliquer une fonction de validation à chaque fichier, vous permettant de les sélectionner en fonction de critères autres que leurs noms (c.-à-d. Taille du fichier, contenu, date de création, etc.).
NOTE: dans les versions plus récentes de MATLAB (R2016b et suivantes), la fonction dir
a des capacités de recherche récursives! Vous pouvez donc faire ceci pour obtenir une liste de tous les fichiers *.m
dans tous les sous-dossiers du dossier courant:
dirData = dir('**/*.m');
ancien code: (pour la postérité)
Voici une fonction qui recherche récursivement à travers tous les sous-répertoires d'une donnée répertoire, la collecte d'une liste de tous les noms de fichiers qu'il trouve:
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
après avoir sauvegardé la fonction ci-dessus quelque part sur votre chemin MATLAB, vous pouvez l'appeler de la manière suivante:
fileList = getAllFiles('D:\dic');
vous recherchez dir pour retourner le contenu du répertoire.
pour passer en boucle sur les résultats, vous pouvez simplement faire ce qui suit:
dirlist = dir('.');
for i = 1:length(dirlist)
dirlist(i)
end
cela devrait vous donner la sortie dans le format suivant, par exemple:
name: 'my_file'
date: '01-Jan-2010 12:00:00'
bytes: 56
isdir: 0
datenum: []
j'ai utilisé le code mentionné dans cette grande réponse et l'ai étendu pour supporter 2 paramètres supplémentaires dont j'avais besoin dans mon cas. Les paramètres sont des extensions de fichier à filtrer et un indicateur indiquant si concaténer le chemin complet vers le nom du fichier ou non.
j'espère que c'est assez clair et que quelqu'un trouve, il est bénéfique.
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
exemple pour exécuter le code:
fileList = getAllFiles(dirName, '*.xml', 0); %#0 is false obviously
vous pouvez utiliser regexp ou strcmp pour éliminer .
et ..
Ou vous pouvez utiliser le champ isdir
si vous voulez seulement des fichiers dans le répertoire, pas des dossiers.
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
ou combiner les deux dernières lignes:
filenames={list(~[list.isdir]).name};
pour une liste de dossiers dans le répertoire excluant . et. .
dirnames={list([list.isdir]).name};
dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',dirnames)));
à partir de ce point, vous devriez être en mesure de jeter le code dans une boucle emboîtée, et continuer la recherche chaque sous-dossier jusqu'à ce que votre nom de domaine renvoie une cellule vide pour chaque sous-dossier.
Cette réponse ne répond pas directement à la question, mais peut-être une bonne solution à l'extérieur de la boîte.
j'ai voté en faveur de la solution de gnovice, mais je veux offrir une autre solution: utilisez la commande système dépendante de votre système d'exploitation:
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.
positif:
- très rapide (dans mon cas pour une base de données de 18000 fichiers sur linux).
- Vous pouvez utiliser bien testé solution.
- vous n'avez pas besoin d'apprendre ou de réinventer une nouvelle syntaxe pour sélectionner les fichiers
*.wav
.
négatif:
- Vous n'êtes pas indépendant du système.
- vous comptez sur une seule corde qui peut être difficile à analyser.
Je ne connais pas de méthode à fonction unique pour cela, mais vous pouvez utiliser genpath
pour recréer une liste de sous-répertoires seulement . Cette liste est retournée comme une chaîne de répertoires délimitée par un point-virgule, Vous devrez donc la séparer en utilisant strread, i.e.
dirlist = strread(genpath('/path/of/directory'),'%s','delimiter',';')
si vous ne voulez pas inclure le répertoire donné, supprimez la première entrée de dirlist
, i.e. dirlist(1)=[];
car il s'agit toujours de la première entrée.
Puis obtenir la liste des fichiers dans chaque répertoire avec une boucle 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
renvoie le séparateur de répertoires de la plate-forme sur laquelle MATLAB est en cours d'exécution.
cela vous donne une liste de noms de fichiers avec des chemins complets dans le tableau de cellules filenamelist . Pas la plus élégante solution, je le sais.
c'est une fonction pratique pour obtenir des noms de fichiers, avec le format spécifié (habituellement .mat
) dans un dossier racine!
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
dans votre cas, vous pouvez utiliser l'extrait suivant:)
filenames = getFilenames('D:/dic/**');
for i = 1:numel(filenames)
filename = filenames{i};
% do your job!
end
avec peu de modification mais approche presque similaire pour obtenir le chemin complet du fichier de chaque sous-dossier
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