Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

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 27 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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .