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


16

有什么方法可以执行mv命令而无需在第二个参数中键入完整路径?

例:

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


1
有什么原因不能仅仅cd访问目录并mv从那里开始?
zpletan 2012年

我经常发现自己在日常工作中会在多个目录中执行这些命令。我经常需要从给定的父目录执行几个命令。
Finbarr 2012年

我以某种方式发现使用!! 终端中的(双感叹号)用于运行最后执行的命令。您也可以在最后一个命令中添加参数/文本,但从不尝试从最后一个命令中更改/删除文本。尝试一下,如果您成功,我会像回答一样将其丢弃。祝好运!
Geppettvs D'Constanzo 2012年

Answers:


32

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


3
太好了 我不知道你能做到
Finbarr 2012年

5

作为括号扩展的替代方法,您可以使用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控制台上重复当前键入的参数?


2

您可以尝试:

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

2

带有变量

  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


变更目录

  1. 您也可以cd转到要在其中工作的目录:cd ./really/long/path
  2. 然后更改文件名: mv foo.bar foo.bz

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


1
第二个看起来很熟悉;-)
zpletan 2012年

2
最好&&在最后一根衬里使用。否则,如果cd失败,mv将在错误的目录中运行,可能会覆盖文件。使用cd ./really/long/path && mv foo.bar foo.bazmv仅在cd成功更改目录时才运行。
盖尔哈2012年

-3

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

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

1
-1 alias test='/var/log' ; cd test给出-bash: cd: test: No such file or directory
zpletan 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.