Batch Convert Files with Pandoc

Many times, when I use Markdown, I work on one file. Once I’m done with it, I convert it to another format, such as a docx or html file. Occasionally, I have to create a small batch of files and convert them. Once I’m in a writing mode, I prefer to “stay in the flow” and write. Conversion can be performed later.

I use Pandoc to convert files and it’s possible convert the lot in one shot.

For this to work, Pandoc needs to be installed. Markdown can convert its files to .html, but if there’s a chance that you’ll have to convert files to other formats, Pandoc is the tool to use. For this post, I’ll assume that you have Pandoc installed.

In this example, I used a Mac and created the Markdown files in a directory called mph.

First, I created the Markdown files. To convert the files, we need to use the command line. Once in the mph directory folder, I ran the ls command to see the list of Markdown files I created.

bills-imac:mph bdyer$ ls -l *.md
-rw-r--r--@ 1 bdyer  staff  1384 Jun 25 16:58 file1.md
-rw-r--r--@ 1 bdyer  staff  2977 Jun 25 17:12 file2.md
-rw-r--r--@ 1 bdyer  staff  1207 Jun 25 16:17 file3.md
-rw-r--r--@ 1 bdyer  staff  2840 Jun 25 17:02 file4.md
-rw-r--r--@ 1 bdyer  staff  3659 Jun 25 15:46 file5.md
-rw-r--r--@ 1 bdyer  staff  4130 Jun 25 15:21 file6.md
-rw-r--r--@ 1 bdyer  staff  2647 Jun 26 12:37 file7.md
-rw-r--r--@ 1 bdyer  staff   427 Jun 25 15:11 file8.md
-rw-r--r--@ 1 bdyer  staff  1069 Jun 25 15:47 file9.md
bills-imac:mph bdyer$

Note: Yes, I did change the names of the files for this post. It’s not that I’m being secretive; I figured that these examples would be easier to follow with the names changed.

To show that there are no HTML files yet…

bills-imac:mph bdyer$ ls -l *.html
ls: *.html: No such file or directory

Now we get to use Pandoc to do its magic on the collection of files. To do this, I run a one-line command that:

The command also echoes the names of the .md files. The command is:

for i in *.md ; do echo "$i" && pandoc -s $i -o $i.html ; done

Here’s what the command line looks like after I’ve executed the command:

bills-imac:mph bdyer$ for i in *.md ; do echo "$i" && pandoc -s $i -o $i.html ; done
file1.md
file2.md
file3.md
file4.md
file5.md
file6.md
file7.md
file8.md
file9.md
bills-imac:mph bdyer$

To see if I have HTML files, I use the ls command to list them:

bills-imac:mph bdyer$ ls -l *.html
-rw-r--r--  1 bdyer  staff  2567 Jun 26 12:27 file1.html
-rw-r--r--  1 bdyer  staff  4190 Jun 26 12:27 file2.html
-rw-r--r--  1 bdyer  staff  1896 Jun 26 12:27 file3.html
-rw-r--r--  1 bdyer  staff  3608 Jun 26 12:27 file4.html
-rw-r--r--@ 1 bdyer  staff  4603 Jun 26 12:27 file5.html
-rw-r--r--  1 bdyer  staff  5201 Jun 26 12:27 file6.html
-rw-r--r--  1 bdyer  staff  3209 Jun 26 12:27 file7.html
-rw-r--r--  1 bdyer  staff   999 Jun 26 12:27 file8.html
-rw-r--r--  1 bdyer  staff  1802 Jun 26 12:27 file9.html
bills-imac:mph bdyer$

For this particular job, I needed to create web pages, but we’re not limited to this. The same thing can be done if I need to convert to, say, .docx files. Simply run the above command, making sure to use $i.docx in place of $i.html in the command string.