Is there any shortcut to reference the path of the first argument in a MV command?

后端 未结 5 561
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-16 01:07

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 w

相关标签:
5条回答
  • 2020-12-16 01:33

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

    0 讨论(0)
  • 2020-12-16 01:34

    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:

    • Eric Bergen > Bash Brace Expansion
    • Bash Brace Expansion | Linux Journal
    0 讨论(0)
  • 2020-12-16 01:35

    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:

    • bash history expansion
    • zsh history expansion
    0 讨论(0)
  • 2020-12-16 01:36

    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>
    
    0 讨论(0)
  • 2020-12-16 01:42

    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

    0 讨论(0)
提交回复
热议问题