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

有没有办法在没有在第二个参数中键入完整路径的情况下执行mv命令?

例:

mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz

你可以使用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 。

作为大括号扩展的替代方法,您可以使用bash shell的历史扩展function:

  • ! 介绍历史扩展
  • #event指示符表示当前命令
  • $ word指示符指的是最后一个参数

您可以使用类似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' 

如果您想要特定的路径(例如,将文件转换为完全不同的名称,通过替换不容易获得),您可以使用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控制台上重复当前键入的参数?

你可以尝试:

 pushd . cd /really/long/directory/name/ mv whatever.1 whatever.2 popd 

带变量

  1. 将目录保存在变量中: `DIR=./really/long/path/
  2. 使用move: mv "$DIR"foo.bar "$DIR"foo.bz

在一行中: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz


更改目录

  1. 您也可以cd到您想要使用的目录: cd ./really/long/path
  2. 然后更改文件名: mv foo.bar foo.bz

在一行中: cd ./really/long/path && mv foo.bar foo.bz

您可以使用别名命令来缩短目录名称:

 alias src='/directory/name/of/source' alias dst='/directory/name/of/destination' mv src dst