命令行移动具有长目录路径的文件而不重复目录路径

命令行移动具有长目录路径的文件而不重复目录路径

有没有办法执行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

相关内容