44

Possible Duplicate:
Reuse text on a bash command

If I want to rename a file a few directories deep, how can I avoid repeating the path?

For example:

mv path/to/old_filename.txt path/to/new_filename.txt

I'm wondering if there's a way to make this:

mv path/to/old_filename.txt (?)new_filename.txt

Where (?) would be some way of saying "in the same directory."

0

4 Answers 4

30

Using bash history expansion:

mv path/to/oldfile !#:1:h/newfile

where !#:1:h means: from the line you're currently typing ("!#"), take the first word (":1"), then take only the path component (":h" -- the head) from it.

3
  • This is the closest to what the original questioner assumed the solution might be, and is useful to know, so +1.
    – crazy2be
    Jun 16, 2011 at 20:28
  • 2
    Cool! I think Darth's brace expansion method is easier, but this is exactly what I asked for. Jun 24, 2011 at 15:29
  • I've learned two great new things today. Also, I will forever think of brace expansion as "Darth's brace expansion" because it sounds awesome.
    – sqlHippo
    Jul 13, 2011 at 15:32
65

You can use brace expansion: mv path/to/{old_filename.txt,new_filename.txt}

Here is a link to the GNU guide on brace expansion in the bash shell, which defines a list of substitutes and tells bash to repeat the parameter using a different substitute each time it repeats.

For example,

a{b,c,dd,e}

will be expanded to

ab ac add ae

The only caveat is that the expanded repetitions must be able to follow each other as arguments to the target program.

1
  • 6
    Or keeping it to a minimum: mv path/to/{old,new}_filename.txt. This also helps reversal or other kinds of close-to-repetition of the command. I have many times done e.g. mv /etc/X11/xorg.conf{,.backup}, being able to reverse the process by the simple change mv /etc/X11/xorg.conf{.backup,}. Mar 21, 2012 at 16:03
28

Darth's answer above is clever, but if you want to use an approach with cd, you could also consider using a subshell:

(cd path/to && mv old_filename.txt new_filename.txt)

Because the directory change takes place in the subshell, you will not actually change directories in your interactive shell.

1
  • 2
    Significant drawback: You cannot use tab-completion for old_filename.txt.
    – bluenote10
    Nov 6, 2014 at 8:50
11

Another alternative that is useful, if you are going to do several commands in the directory, is this:

pushd /path/to
mv oldfile newfile
...
popd
0

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