How to mass prepend text to file names?
Solution 1:
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
Solution 2:
If you have prename
...
prename 's/^/test - /' *.md
Using ordinary shell commands:
for file in *.md; do
mv "$file" "test - $file"
done
Solution 3:
mmv
1,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.