Saya perlu mendapatkan semua file itu di bawah D:\dic
dan mengulanginya untuk diproses lebih lanjut satu per satu.
Apakah MATLAB mendukung operasi semacam ini?
Itu dapat dilakukan di skrip lain seperti PHP, Python ...
Pembaruan: Mengingat bahwa posting ini cukup lama, dan saya telah banyak memodifikasi utilitas ini untuk penggunaan saya sendiri selama waktu itu, saya pikir saya harus memposting versi baru. Kode terbaru saya dapat ditemukan di The MathWorks Berkas Efek : dirPlus.m
. Anda juga bisa mendapatkan sumbernya dari GitHub .
Saya membuat sejumlah perbaikan. Sekarang memberi Anda opsi untuk menambahkan jalur lengkap atau mengembalikan hanya nama file (digabungkan dari Doresoom dan Oz Radiano ) dan menerapkan pola ekspresi reguler ke nama file (digabungkan dari Peter D ). Selain itu, saya menambahkan kemampuan untuk menerapkan fungsi validasi ke setiap file, memungkinkan Anda memilihnya berdasarkan kriteria selain hanya namanya (yaitu ukuran file, konten, tanggal pembuatan, dll.).
CATATAN: Dalam versi MATLAB yang lebih baru (R2016b dan yang lebih baru), dir
fungsi tersebut memiliki kemampuan pencarian rekursif! Jadi, Anda dapat melakukan ini untuk mendapatkan daftar semua *.m
file di semua subfolder dari folder saat ini:
dirData = dir('**/*.m');
Berikut adalah fungsi yang mencari secara rekursif melalui semua subdirektori dari direktori tertentu, mengumpulkan daftar semua nama file yang ditemukannya:
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
Setelah menyimpan fungsi di atas di suatu tempat di jalur MATLAB Anda, Anda dapat memanggilnya dengan cara berikut:
fileList = getAllFiles('D:\dic');
fileList = strcat(dirName,filesep,fileList);
daripada menggunakan CELLFUN, meskipun Anda dapat berakhir dengan pemisah file ekstra yang tidak perlu dengan cara itu, yang juga ditangani oleh FULLFILE untuk Anda.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
dan mengubah tanda tangan fungsi menjadigetAllFiles(dirName, pattern)
(juga di baris ke-2 hingga terakhir)Anda mencari dir untuk mengembalikan isi direktori.
Untuk mengulang hasil, Anda cukup melakukan hal berikut:
Ini akan memberi Anda keluaran dalam format berikut, misalnya:
sumber
.
dan..
?dir('*.ext')
, yang secara otomatis mengecualikan direktori (kecuali jika diakhiri dengan .ext, tentu saja)Saya menggunakan kode yang disebutkan dalam jawaban hebat ini dan mengembangkannya untuk mendukung 2 parameter tambahan yang saya butuhkan dalam kasus saya. Parameternya adalah ekstensi file untuk difilter dan sebuah bendera yang menunjukkan apakah akan menggabungkan jalur lengkap ke nama file atau tidak.
Saya harap ini cukup jelas dan seseorang akan merasakan manfaatnya.
Contoh untuk menjalankan kode:
sumber
Anda dapat menggunakan regexp atau strcmp untuk menghilangkan
.
dan..
Atau Anda dapat menggunakanisdir
field jika Anda hanya ingin file dalam direktori, bukan folder.atau gabungkan dua baris terakhir:
Untuk daftar folder di direktori tidak termasuk. dan ..
Dari titik ini, Anda harus bisa melempar kode ke loop for bersarang, dan terus mencari setiap subfolder sampai dirnames Anda mengembalikan sel kosong untuk setiap subdirektori.
sumber
Jawaban ini tidak langsung menjawab pertanyaan tetapi mungkin merupakan solusi yang baik di luar kotak.
Saya memberi suara positif pada solusi gnovice, tetapi ingin menawarkan solusi lain: Gunakan perintah yang bergantung pada sistem dari sistem operasi Anda:
Positif:
*.wav
file ie .Negatif:
sumber
Saya tidak tahu metode satu fungsi untuk ini, tetapi Anda hanya dapat menggunakan
genpath
daftar subdirektori untuk mengulang . Daftar ini dikembalikan sebagai string direktori yang dipisahkan titik koma, jadi Anda harus memisahkannya menggunakan strread, yaitudirlist = strread(genpath('/path/of/directory'),'%s','delimiter',';')
Jika Anda tidak ingin menyertakan direktori yang diberikan, hapus entri pertama
dirlist
, yaitudirlist(1)=[];
karena ini selalu merupakan entri pertama.Kemudian dapatkan daftar file di setiap direktori dengan loop
dir
.filesep
mengembalikan pemisah direktori untuk platform yang menjalankan MATLAB.Ini memberi Anda daftar nama file dengan jalur lengkap dalam daftar file array sel . Bukan solusi yang paling rapi, saya tahu.
sumber
genpath
, itu pada dasarnya mencari dua kali.private
, direktori tersebut tidak akan disertakan.Ini adalah fungsi praktis untuk mendapatkan nama file, dengan format yang ditentukan (biasanya
.mat
) di folder root!Dalam kasus Anda, Anda dapat menggunakan cuplikan berikut :)
sumber
Dengan sedikit modifikasi tetapi pendekatan yang hampir mirip untuk mendapatkan path file lengkap dari setiap sub folder
sumber