Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Lets say I have a directory full of .md files all named various things. Lets say I wanted to prepend "text" to the front of each file name. So for example: file,, and would become test -, test -, and test -

How would I accomplish this via command line?

share|improve this question
up vote 25 down vote accepted

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
    mv "$f" "test - $f"


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

mv "$f" "test - $f"


mv "" "test -"

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, it would translate as:

mv Foo test - Foo

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

mv "Foo" "test - Foo"

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

for f in; do mv "$f" "Test - $f"; done

Or using shell expansion:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done
share|improve this answer
This is exactly what I needed to see. Thanks! – Ryan May 19 at 16:10

If you have prename...

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

Using ordinary shell commands:

for file in *.md; do
    mv "$file" "test - $file"
share|improve this answer

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

mmv '*.md' 'test -'

Of course, if you only want to add "test - " to, and, but not, something like

mmv '?.md' 'test -'

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.

share|improve this answer

Instead of using a for loop, which will fail on spaces unless you redefine the IFS variable, I would recommend using a while loop combined with find. The following will work when run from the same directory as the files

find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
    file=$(basename $file)
    mv "$file" "test - $file"

the "basename" line is in there so that find will print the file name only - without path components which would make the rename operation break.

share|improve this answer

If you have zsh available you could use zmv:

autoload zmv
zmv -w '*' 'test - $1'

You can test the command with:

zmv -wn '*' 'test - $1'
  • -n means dry-run, i.e. only show what will happen.
  • -w implicitly puts parenthesis around wildcards, makes backreferences work.
share|improve this answer

In bash, adding "Prepend text - " to all files in folder:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
share|improve this answer
This is a super-long way of writing for i in *; do mv "$i$" "Prepend text - $i"; done – David Richerby May 4 at 7:20

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.