有没有办法执行mv
命令而不在第二个参数中输入完整路径?
例子:
mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz
答案1
您可以使用 bash 的括号扩展。例如:
mv my/file/that/has/a/really/long/path/foo.{bar,baz}
将扩展为:
mv my/file/that/has/a/really/long/path/foo.bar my/file/that/has/a/really/long/path/foo.baz
然后mv
使用这两个参数运行。参见http://wiki.bash-hackers.org/syntax/expansion/brace有关括号扩展的更多信息。
答案2
作为括号扩展的替代方法,您可以使用 bash shell 的历史扩展特征:
!
引入历史扩展#
表示当前命令的事件指示符$
指向最后一个参数的字指示符
您可以使用类似 sed 的语法对扩展执行替换,s/pattern/replacement
例如
somecommand path/to/foo.bar !#$:s/.bar/.baz
前任。
$ mv -v somepath/Original/Dir3/SubDir1/foo.bar !#$:s/.bar/.baz
mv -v somepath/Original/Dir3/SubDir1/foo.bar somepath/Original/Dir3/SubDir1/foo.baz
'somepath/Original/Dir3/SubDir1/foo.bar' -> 'somepath/Original/Dir3/SubDir1/foo.baz'
如果您想要具体的路径(例如,指向mv
一个完全不同的名称的文件,而该名称不能通过替换轻易获得),则可以使用h
修饰符:
$ mv -v somepath/Original/Dir3/SubDir1/foo.baz !#$:h/baz.foo
mv -v somepath/Original/Dir3/SubDir1/foo.baz somepath/Original/Dir3/SubDir1/baz.foo
'somepath/Original/Dir3/SubDir1/foo.baz' -> 'somepath/Original/Dir3/SubDir1/baz.foo'
有关其他选项,包括readline
提取最后一个参数的组合键,请参阅如何在 Bash 控制台上重复当前输入的参数?
答案3
您可以尝试:
pushd .
cd /really/long/directory/name/
mv whatever.1 whatever.2
popd
答案4
您可以使用别名命令来缩短目录名称:
alias src='/directory/name/of/source'
alias dst='/directory/name/of/destination'
mv src dst