We use a web server that does not allow directory listing.
There is a specific directory I would like to allow listing of.
How can make a simple HTML file that will contain the contents of this directory?
We use a web server that does not allow directory listing.
There is a specific directory I would like to allow listing of.
How can make a simple HTML file that will contain the contents of this directory?
There are enough valid reasons to explicitly disable automatic directory indexes in apache or other web servers. Or, for example, you might want to only include certain file types in the index. In such cases you might still want to have a statically generated index.html file for specific folders.
treetree is a minimalistic utility that is available on most unix-like systems (ubuntu/debian: sudo apt install tree, mac: brew install tree, windows: zip). tree can generate plain text, XML, JSON or HTML output.
Generate an HTML directory index one level deep:
tree -H '.' -L 1 --noreport --charset utf-8 -o index.html
Only include specific file types that match a glob pattern, e.g. *.zip files:
tree -H '.' -L 1 --noreport --charset utf-8 -P "*.zip" -o index.html
The argument to
-His what will be used as a base href, so you can pass either a relative path such as.or an absolute path from the web root, such as/files.-L 1limits the listing to the current directory only.
tree does not expose a flag to disable the credits in the HTML footer, but you can cut out that block by piping through sed:
# delete 7 lines starting with the line matching <hr>
tree -H '.' -L 1 --noreport --charset utf-8 | sed -e '/<hr>/,+7d' > index.html
For all supported options see tree --help or man tree in a shell.
I needed an index generator which I could style the way I want, and which would also include the file sizes, so ended up writing this script (python 3) which in addition to having customisable styling can also recursively generate an index.html file in all the nested subdirectories (with the --recursive or -r flag). The styling borrows heavily from caddyserver's file-server module. It includes last modified time and is responsive in mobile viewports.
There's a free php script made by Celeron Dude that can do this called Celeron Dude Indexer 2. It doesn't require .htaccess The source code is easy to understand and provides a good starting point.
Here's a download link: https://gitlab.com/desbest/celeron-dude-indexer/

If you have a staging server that has directory listing enabled, then you can copy the index.html to the production server.
For example:
wget https://staging/dir/index.html
# do any additional processing on index.html
scp index.html prod/dir
If you have node then you can use fs like in this answer to get all the files:
const { resolve } = require('path'),
{ readdir } = require('fs').promises;
async function getFiles(dir) {
const dirents = await readdir(dir, { withFileTypes: true });
const files = await Promise.all(dirents.map((dirent) => {
const res = resolve(dir, dirent.name);
return dirent.isDirectory() ? getFiles(res) : res;
}));
return Array.prototype.concat(...files);
}
And you might use that like this:
const directory = "./Documents/";
getFiles(directory).then(results => {
const html = `<ul>` +
results.map(fileOrDirectory => `<li>${fileOrDirectory}</li>`).join('\n') +
`</ul>`;
process.stdout.write(html);
// or you could use something like fs.writeFile to write the file directly
});
You could call it at the command-line with something like this:
$ node thatScript.js > index.html