Skip to content

Instantly share code, notes, and snippets.

@premek
Last active March 5, 2024 17:43
Show Gist options
  • Save premek/6e70446cfc913d3c929d7cdbfe896fef to your computer and use it in GitHub Desktop.
Save premek/6e70446cfc913d3c929d7cdbfe896fef to your computer and use it in GitHub Desktop.
Rename files in linux / bash using mv command without typing the full name two times
# Put this function to your .bashrc file.
# Usage: mv oldfilename
# If you call mv without the second parameter it will prompt you to edit the filename on command line.
# Original mv is called when it's called with more than one argument.
# It's useful when you want to change just a few letters in a long name.
#
# Also see:
# - imv from renameutils
# - Ctrl-W Ctrl-Y Ctrl-Y (cut last word, paste, paste)
function mv() {
if [ "$#" -ne 1 ] || [ ! -e "$1" ]; then
command mv "$@"
return
fi
read -ei "$1" newfilename
command mv -v -- "$1" "$newfilename"
}
@cameronsstone
Copy link

cameronsstone commented Apr 14, 2020

Firstly, thank you - this is nice™.

zsh equivalent:

function mv() {
  if [ "$#" -ne 1 ] || [ ! -f "$1" ]; then
    command mv "$@"
    return
  fi

  newfilename="$1"
  vared newfilename
  command mv -v -- "$1" "$newfilename"
}

Kudos to Gilles 'SO- stop being evil' for StackExchange answer.

BTW, fish also has vared, so this should probably work for fish, too, and be lighter-weight than Humandoodlebug's excellent bash subshell solution.

@dbgrigsby
Copy link

Yeah, many ways to do this but would argue readline's Ctrl-W Ctrl-Y Ctrl-Y is cleanest since it's useful to know anyway and available almost anywhere. :)

Screen Recording 2020-04-13 at 06 43 PM
That is quite nice! Biggest fan of this since it's very little typing and applies in way more situations than the OP

@rileytg
Copy link

rileytg commented Apr 15, 2020

@rileytg man readline (sorry for the terse answer but that's the library bash uses and where you will find, in long form, what options are available)

thank you! i didnt realize readline was so foundational to a lot of what i use every day

@szkrd
Copy link

szkrd commented Apr 16, 2020

I like it, it's especially useful if you have spaces in the file (or directory) name (btw the bash cut last word would not work then). Probably I would also flip the conditional and add directory checking:

if [ "$#" -eq 1 ] && ( [ -f "$1" ] || [ -d "$1" ] ); then
  read -ei "$1" newfilename; command mv -v "${1}" "${newfilename}"; return $?
fi
command mv "$@"; return $?

@b3n10
Copy link

b3n10 commented Apr 16, 2020

You can also do Ctrl-W followed by Ctrl-Y after typing the path, if you are using readline style keybindings. Mainstream shells come with readline style bindings by default.

Ctrl-W deletes the previous word for me

@premek
Copy link
Author

premek commented Apr 16, 2020

@szkrd

[...] and add directory checking

-e was what I wanted, not -f. Thanks

@NightMachinery
Copy link

In zsh you need compdef mv=ls, it seems, or the completion breaks.

@fernandezpablo85
Copy link

@premek your snippet is great, short, concise and to the point. Thanks for sharing it.

@collegeimprovements
Copy link

Yeah, many ways to do this but would argue readline's Ctrl-W Ctrl-Y Ctrl-Y is cleanest since it's useful to know anyway and available almost anywhere. :)

Screen Recording 2020-04-13 at 06 43 PM

Excellent.

@zouhair
Copy link

zouhair commented May 4, 2020

There are even more flexible ways (in bash, at least), for example (here renaming .txt to .json):

$ touch config.txt
$ mv config.txt !#:1:s/txt/json

This one eludes me, care to explain how it works?

@christian-oudard
Copy link

I would recommend adding --interactive to the mv commands in the script. As it is now, it is possible to overwrite existing files with no confirmation using this script.

@thecatvoid
Copy link

With the fish shell, you can type Alt-E to edit any command line in your favorite editor where you likely already know shortcuts for copying, pasting and modifying. The great thing is that is a general solution that works for any command line edits.

In bash it is C-x C-e

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment