60

I know how to rename files in Unix:

$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh

     ^-------this part------^    ^------this part-------^

It takes too long time to repeat ~/folder/subfolder/file twice.

Is there a quicker way?

Hamed Kamrava
  • 6,678
  • 12
  • 35
  • 47

6 Answers6

111

If your shell supported Brace Expansion (works with csh, tcsh, ksh, zsh, bash, mksh, lksh, pdksh, yash with brace-expand enabled by calling yash --brace-expand or set in interative shell with set -o brace-expand, or fish):

mv ~/folder/subfolder/file.{txt,sh}
cuonglm
  • 150,973
  • 38
  • 327
  • 406
  • 4
    simple is the best! – Braiam May 27 '14 at 18:05
  • 2
    awesome use of expansion in shell brilliant! – harish.venkat May 27 '14 at 18:10
  • 3
    It _is_ awesome, but really cryptic. It works but at the first glance I would think it does something different: moves two file somewhere. I don't think this is a great idea, especially since there is a much better solution using `rename`. – yo' May 28 '14 at 21:07
  • 5
    @tohecz: Why is it cryptic? It's a feature of shell and every one can know it by reading shell man page. And I don't think `rename` is a better solution because `rename` never ask you to override the existing file or not. – cuonglm May 29 '14 at 02:32
  • 1
    @Gnouc you're the man. – beginer Sep 01 '14 at 12:26
  • This worked in Ubuntu 18 without needing to enable any extensions. – Shital Shah Jan 26 '20 at 01:43
  • using this, how would I rename `~/fruits/bananas_and_mangos` into `~/fruits/pineapples_and_mangos` ? – Salomanuel Mar 17 '22 at 15:16
23

You can also use rename (part of the util-linux package).

rename .txt .sh ~/folder/subfolder/file.txt

See the rename man page for more details.

ctrl-alt-delor
  • 27,473
  • 9
  • 58
  • 102
jofel
  • 26,513
  • 6
  • 65
  • 92
10

All the above are good. This would also work :

( cd ~/folder/subfolder && mv file.txt file.sh )
ctrl-alt-delor
  • 27,473
  • 9
  • 58
  • 102
Bjorn
  • 127
  • 3
8

No. You need to give the full path to the file in order to rename it. The only alternative is to move into the target folder before running the mv:

cd ~/folder/subfolder/
mv file.txt file.sh

Alternatively, you could write a little function that renames the file in the target directory. For example, add these lines to your shell initialization file (~/.bashrc if you are using bash):

lmv(){
    _path=$(dirname -- "$1")
    _target="${_path%/}/$2"
    mv -- "$1" "$_target"
}

Then, open a new terminal or just run source ~/.bashrc to re-read the init file and you can do:

lmv ~/folder/subfolder/file.txt file.sh
terdon
  • 234,489
  • 66
  • 447
  • 667
3

Just to expand the usefulness of cuonglm's answer (NOT to take any credit as I love his solution) and his answer is a correct one.

The use case is that we often want to mv a file in a remote location (the real issue), e.g. /folder/subfolder/configFile.dat TO configFile.dat.orig

This form of the command adds a file extension (not replacing the original extension)

mv ~/folder/subfolder/file.txt{,.orig}

Explained: "{,.orig}" means replace (nothing) on the end of the file name with (something) ".orig"

OR to remove a file extension (reverse the rename)

mv ~/folder/subfolder/file.txt{.orig,}

Note: Still on topic for "Quickest way to rename files without retyping the dir path"

spikendu
  • 31
  • 3
1

Yes. If you use bash, you do sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd.

Which is actually bigger and may fail if you lost access permissions to the original directory when you did the popd.

41754
  • 85
  • 1
  • 7
  • 19
  • 1
    What's the point of `pushd` and `popd` here? How is this better than `cd ~/folder/subfolder/ && sudo mv file.txt file.sh`? – terdon May 27 '14 at 16:20
  • 1
    The point is, that you are after the command back in the folder you started, not in any subfolder. An alternative to `pushd` `popd` is to use `cd` and go back with `cd -`. – jofel May 27 '14 at 16:27
  • The questioner seemed to state an intention not to change the working directory, and `popd` is better than `cd ../../`, when available. – 41754 May 27 '14 at 16:32
  • 7
    Use `(cd /path/to/there && mv x y)` then (with a subshell) – Stéphane Chazelas May 27 '14 at 16:39
  • You really should not put `sudo` before `pushd`. So the full command should be `pushd ...dir && sudo mv old new && popd`. As an alternative, one could do `(cd ...dir; sudo mv old new)` because running in subshell will take care of directory changes automatically. – Mikko Rantalainen Mar 12 '19 at 11:38