Iterate over files and convert with a new name / directory I'm pretty new to bash scripting.  I want a script that I can run in a directory that contains .md files, runs pandoc on them, and delivers the output to a sibling folder html, i.e. my folder structure is like this:

.
├── html
└── md


Here is what I have working, I just don't know if I'm following good practices or if there's a nicer / more readable way of doing what I'm doing.

#! /bin/bash
# run this from a folder containing markdown files
# it delivers html to the sibling html folder
if hash pandoc 2&gt;/dev/null; then
  for file in ./*.md ; do
    echo Converting $file
    cat "$file" | pandoc -o "$(echo $file | sed 's/^./..\/html/' |  sed 's/.md$/.html/')"
  done
else
  echo "I need pandoc installed"
fi
UUOC. pandoc takes the input file name as an argument. echo $file | pandoc -o outfile is equivalent to pandoc -o outfile $file. One process invocation down.
UUOS (sed in this case). bash has very rich string transformation features built in. For example, ${file%md} (see Parameter expansion section of man bash) will strip the md suffix form the filename. So consider

for file in *.md; do
    pandoc -o ../html/${file%md}html
done


Two more process invocations down.
If by any chance an .md filename contains funny characters (like whitespace), the substitution will produce unexpected results. It is safer to use double quotes, as in `"${....}".


PS: It might be beneficial to abandon the shell script altogether in favor of make, with a Makefile having a single stem rule

../html/%.html: %.md
    pandoc -o $@ $&lt;