Muszę umieścić wszystkie te pliki pod D:\dic
spodem i zapętlić je w celu dalszego przetwarzania indywidualnie.
Czy MATLAB obsługuje tego typu operacje?
Można to zrobić w innych skryptach, takich jak PHP, Python ...
Aktualizacja: Biorąc pod uwagę, że ten post jest dość stary, aw tym czasie bardzo zmodyfikowałem to narzędzie na własny użytek, pomyślałem, że powinienem opublikować nową wersję. Mój najnowszy kod można znaleźć na MathWorks File Exchange : dirPlus.m
. Możesz również pobrać źródło z GitHub .
Wprowadziłem szereg ulepszeń. Teraz daje możliwość dołączenia pełnej ścieżki lub zwrócenia samej nazwy pliku ( zawartej w Doresoom i Oz Radiano ) i zastosowania wzorca wyrażenia regularnego do nazw plików (zaczerpnięty z Petera D ). Dodatkowo dodałem możliwość zastosowania funkcji walidacji do każdego pliku, co pozwala na ich wybór na podstawie innych kryteriów niż tylko ich nazwy (np. Rozmiar pliku, zawartość, data utworzenia itp.).
UWAGA: W nowszych wersjach MATLAB (R2016b i nowsze) dir
funkcja ma możliwość wyszukiwania rekurencyjnego! Możesz więc to zrobić, aby uzyskać listę wszystkich *.m
plików we wszystkich podfolderach bieżącego folderu:
dirData = dir('**/*.m');
Oto funkcja, która przeszukuje rekurencyjnie wszystkie podkatalogi danego katalogu, zbierając listę wszystkich znalezionych nazw plików:
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
Po zapisaniu powyższej funkcji gdzieś na swojej ścieżce MATLAB-a możesz ją wywołać w następujący sposób:
fileList = getAllFiles('D:\dic');
fileList = strcat(dirName,filesep,fileList);
zamiast używać CELLFUN, chociaż w ten sposób możesz skończyć z dodatkowymi niepotrzebnymi separatorami plików, którymi FULLFILE również zajmie się tobą.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
i zmień sygnaturę funkcji nagetAllFiles(dirName, pattern)
(również w drugiej do ostatniej linii)Szukasz reż wrócić zawartość katalogów.
Aby zapętlić wyniki, możesz po prostu wykonać następujące czynności:
Powinno to dać wynik w następującym formacie, np .:
źródło
.
i..
?dir('*.ext')
, co automatycznie wyklucza katalogi (chyba że kończą się na .ext, oczywiście)Użyłem kodu wymienionego w tej świetnej odpowiedzi i rozszerzyłem go tak, aby obsługiwał 2 dodatkowe parametry, których potrzebowałem w moim przypadku. Parametry to rozszerzenia plików do filtrowania i flaga wskazująca, czy połączyć pełną ścieżkę do nazwy pliku, czy nie.
Mam nadzieję, że jest to wystarczająco jasne i komuś się przyda.
Przykład uruchomienia kodu:
źródło
Możesz użyć regexp lub strcmp, aby wyeliminować
.
i..
lub możesz użyć tegoisdir
pola, jeśli chcesz tylko pliki w katalogu, a nie foldery.lub połącz ostatnie dwie linie:
Aby uzyskać listę folderów w katalogu z wyłączeniem plików. i ..
Od tego momentu powinieneś być w stanie wrzucić kod do zagnieżdżonej pętli for i kontynuować przeszukiwanie każdego podfolderu, aż dirnames zwróci pustą komórkę dla każdego podkatalogu.
źródło
Ta odpowiedź nie odpowiada bezpośrednio na pytanie, ale może być dobrym rozwiązaniem poza polem.
Głosowałem za rozwiązaniem gnovice, ale chcę zaoferować inne rozwiązanie: użyj polecenia zależnego od systemu w swoim systemie operacyjnym:
Pozytywny:
*.wav
. Pliki.Negatywny:
źródło
Nie znam metody jednofunkcyjnej do tego, ale możesz użyć
genpath
do powtórzenia tylko listy podkatalogów . Ta lista jest zwracana jako ciąg katalogów rozdzielany średnikami, więc będziesz musiał oddzielić ją za pomocą strread, tj.dirlist = strread(genpath('/path/of/directory'),'%s','delimiter',';')
Jeśli nie chcesz dołączać podanego katalogu, usuń pierwszy wpis
dirlist
, tj.dirlist(1)=[];
Ponieważ jest to zawsze pierwszy wpis.Następnie pobierz listę plików w każdym katalogu z zapętlonym
dir
.filesep
zwraca separator katalogów dla platformy, na której działa MATLAB.W ten sposób otrzymasz listę nazw plików z pełnymi ścieżkami w tablicy komórek filenamelist . Wiem, że nie jest to najładniejsze rozwiązanie.
źródło
genpath
, zasadniczo przeszukuje dwukrotnie.private
, nie zostaną one uwzględnione.Jest to przydatna funkcja do pobierania nazw plików w określonym formacie (zwykle
.mat
) w folderze głównym!W twoim przypadku możesz użyć następującego fragmentu :)
źródło
Z niewielkimi modyfikacjami, ale prawie podobnym podejściem, aby uzyskać pełną ścieżkę do każdego podfolderu
źródło