Necesito poner todos esos archivos debajo D:\dic
y recorrerlos para procesarlos individualmente.
¿MATLAB admite este tipo de operaciones?
Se puede hacer en otros scripts como PHP, Python ...
Actualización: dado que esta publicación es bastante antigua y he modificado mucho esta utilidad para mi propio uso durante ese tiempo, pensé que debería publicar una nueva versión. Mi código más reciente se puede encontrar en The MathWorks Archivo Cambio : dirPlus.m
. También puede obtener la fuente de GitHub .
Hice una serie de mejoras. Ahora le brinda opciones para anteponer la ruta completa o devolver solo el nombre del archivo (incorporado de Doresoom y Oz Radiano ) y aplicar un patrón de expresión regular a los nombres de archivo (incorporado de Peter D ). Además, agregué la capacidad de aplicar una función de validación a cada archivo, lo que le permite seleccionarlos en función de criterios distintos a sus nombres (es decir, tamaño del archivo, contenido, fecha de creación, etc.).
NOTA: En las versiones más recientes de MATLAB (R2016b y posteriores), la dir
función tiene capacidades de búsqueda recursiva. Entonces puede hacer esto para obtener una lista de todos los *.m
archivos en todas las subcarpetas de la carpeta actual:
dirData = dir('**/*.m');
Aquí hay una función que busca de forma recursiva en todos los subdirectorios de un directorio determinado, recopilando una lista de todos los nombres de archivo que encuentra:
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
Después de guardar la función anterior en algún lugar de su ruta de MATLAB, puede llamarla de la siguiente manera:
fileList = getAllFiles('D:\dic');
fileList = strcat(dirName,filesep,fileList);
lugar de usar CELLFUN, aunque puede terminar con separadores de archivos innecesarios adicionales de esa manera, que FULLFILE también se encarga de usted.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
y cambie la firma de la función agetAllFiles(dirName, pattern)
(también en la segunda a la última línea)Está buscando dir para devolver el contenido del directorio.
Para recorrer los resultados, simplemente puede hacer lo siguiente:
Esto debería darle una salida en el siguiente formato, por ejemplo:
fuente
.
y..
?dir('*.ext')
, lo que excluye automáticamente los directorios (a menos que terminen en .ext, por supuesto)Usé el código mencionado en esta gran respuesta y lo expandí para admitir 2 parámetros adicionales que necesitaba en mi caso. Los parámetros son extensiones de archivo para filtrar y una bandera que indica si concatenar la ruta completa al nombre del archivo o no.
Espero que sea lo suficientemente claro y que alguien lo encuentre beneficioso.
Ejemplo para ejecutar el código:
fuente
Puede usar regexp o strcmp para eliminar
.
y..
O puede usar elisdir
campo si solo desea archivos en el directorio, no carpetas.o combine las dos últimas líneas:
Para obtener una lista de carpetas en el directorio excluyendo. y ...
Desde este punto, debería poder lanzar el código en un bucle for anidado y continuar buscando en cada subcarpeta hasta que sus nombres de directorio devuelvan una celda vacía para cada subdirectorio.
fuente
Esta respuesta no responde directamente a la pregunta, pero puede ser una buena solución fuera de la caja.
Yo voté a favor de la solución de gnovice, pero quiero ofrecer otra solución: use el comando dependiente del sistema de su sistema operativo:
Positivo:
*.wav
archivos ie .Negativo:
fuente
No conozco un método de función única para esto, pero puede usarlo
genpath
para recurrir solo a una lista de subdirectorios . Esta lista se devuelve como una cadena de directorios delimitada por punto y coma, por lo que tendrá que separarla usando strread, es decirdirlist = strread(genpath('/path/of/directory'),'%s','delimiter',';')
Si no desea incluir el directorio dado, elimine la primera entrada de
dirlist
, es decir,dirlist(1)=[];
ya que siempre es la primera entrada.Luego obtenga la lista de archivos en cada directorio con un bucle
dir
.filesep
devuelve el separador de directorio para la plataforma en la que se ejecuta MATLAB.Esto le da una lista de nombres de archivos con rutas completas en la serie de células filenamelist . No es la mejor solución, lo sé.
fuente
genpath
, básicamente busca dos veces.private
, no se incluirán.Esta es una función útil para obtener nombres de archivos, con el formato especificado (generalmente
.mat
) en una carpeta raíz.En su caso, puede utilizar el siguiente fragmento :)
fuente
Con pocas modificaciones pero un enfoque casi similar para obtener la ruta completa del archivo de cada subcarpeta
fuente