Read files recursively in Deno


Read files recursively in Deno

I love CI/CD pipelines. A lot.

It is often the very first thing I do when starting a project.

One of the reasons I love CI/CD pipelines so much is that they lower the ‘entry cost’ of doing work on the project.

In Atomic Habits, one of James Clear’s rules to make a habit happens is to make it easy. Following that rule, I have created a script that scans my Obsidian vault and finds, processes, and publishes notes directly on my blog. This makes sharing on my blog a lot easier.

In order to retrieve my articles in subfolders, I need to be able to read files recursively in a given folder. It is very easy with Deno.

Deno comes with great utilities straight out of the box to work with the file system, such as Deno.readDir.

This is how I do it, using a recursive algorithm. If you want to know more about read this article. I explain in simple terms what recursion is as opposed to iteration and measure their performance using Deno’s benchmarking tool.

import {join} from ""; // path.join

const FOLDER_PATH = '/my/folder/path';

async function readFilesRecursively(folderPath:string):Promise<Deno.DirEntry[]>{
	const filesFound:Deno.DirEntry[] = []
	for await(const entry of Deno.readDir(folderPath)){
		if(entry.isFile){ // If it is a file, simply add it to my files found
		} else {
			filesFound.push(...await readFilesRecursively(join(folderPath, // Otherwise, it is a directory, find files into that directory
	return filesFound;

async function main():void{
	const files: Deno.DirEntry = await readFilesRecursively(FOLDER_PATH)
	for (const file of files){
		console.log(; // Do something with the files. Here, we only log their name
await main();

Note that Deno allows you to use async/await at the top level, which is a very nice touch.

That’s it! It’s very straightforward.

See you soon 👋,