11

I often find myself using mv to rename a file. E.g.

mv app/models/keywords_builder.rb app/models/keywords_generator.rb

Doing so I need to write (ok, tab complete) the path for the second parameter. In this example it isn't too bad but sometimes the path is deeply nested and it seems like quite a bit of extra typing.

Is there a more efficient way to do this?

4

5 に答える 5

22

And another way: brace expansion.

mv app/models/keywords_{builder,generator}.rb

In general,

before{FIRST,SECOND}after

expands to

beforeFIRSTafter beforeSECONDafter

So it's also useful for other renames, e.g.

mv somefile{,.bak}

expands to

mv somefile somefile.bak

It works in bash and zsh.

More examples:

于 2011-03-31T21:27:06.800 に答える
10

You can use history expansion like this:

mv app/modules/keywords_builder.rb !#^:h/keywords_generator.rb
  1. ! introduces history expansion.
  2. # refers to the command currently being typed
  3. ^ means the first argument
  4. :h is a modifier to get the "head", i.e. the directory without the file part

It's supported in bash and zsh.

Docs:

于 2011-03-31T20:26:53.237 に答える
4

One way is to type the first file name and a space, then press Ctrl+w to delete it. Then press Ctrl+y twice to get two copies of the file name. Then edit the second copy.

For example,

mv app/models/keywords_builder.rb <Ctrl+W><Ctrl+Y><Ctrl+Y><edit as needed>
于 2011-03-31T20:25:09.587 に答える
1

or cd apps/models && mv keywords_builder.rb keywords_generator.rb && cd -

于 2011-03-31T21:28:55.970 に答える
0

Combined answers of Mikel and geekosaur with additonal use of ":p"

use brace expansion to avoid first argument repetition:

mv -iv {,old_}readme.txt # 'readme.txt' -> 'old_readme.txt'

mv -iv file{,.backup} # 'file' -> 'file.backup'

use history expansion to avoid first argument repetition:

mv -iv "system file" !#$.backup # 'system file' -> 'system file.backup'

the filename can be printed using the "p" designator for further edition:

mv -iv "file with a long name" !#$:p

then press "↑" to edit the command

于 2018-01-11T20:07:32.603 に答える