How to mass prepend text to file names?

One-liner that can be easily typed straight from the terminal:

for f in *.md; do mv "$f" "test - $f"; done

Or rewritten on separate lines instead using semicolons:

for f in *.md
do
    mv "$f" "test - $f"
done

Exposition

Syntax of for (in sh):

for NAME [in WORDS ... ] ; do COMMANDS; done

Here, our NAME is f and our WORDS are all files in the current directory matching *.md. So the variable $f will be be substituted with each file matching *.md.

So for a.md:

mv "$f" "test - $f"

becomes

mv "a.md" "test - a.md"

The quotes are important because the each filename $f might contain spaces. Otherwise mv would think each word was a separate file. For example, if there were no quotes, and there's a file called Foo Bar.md, it would translate as:

mv Foo Bar.md test - Foo Bar.md

which would not work as intented. But by wrapping $f in quotes, it makes sense:

mv "Foo Bar.md" "test - Foo Bar.md"

Noting the syntax of for, you could also rename a subset of all the *.md files by naming each explicitly:

for f in a.md b.md d.md; do mv "$f" "Test - $f"; done

Or using shell expansion:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done

If you have prename...

prename 's/^/test - /' *.md

Using ordinary shell commands:

for file in *.md; do
    mv "$file" "test - $file"
done

mmv1,2 is also a very nice tool for such a task, applied to the current job, it would be

mmv '*.md' 'test - #1.md'

Of course, if you only want to add "test - " to a.md, b.md and c.md, but not a1.md, something like

mmv '?.md' 'test - #1.md'

would be more appropriate.

I can really suggest it, especially if you have many such problems.

If you are additionally looking for a graphical interface, try gprename.