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

Fin*_*arr 21 command-line

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

例子:

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

gei*_*rha 38

您可以使用 bash 的大括号扩展。这个:

mv my/file/that/has/a/really/long/path/foo.{bar,baz}
Run Code Online (Sandbox Code Playgroud)

将扩展为:

mv my/file/that/has/a/really/long/path/foo.bar my/file/that/has/a/really/long/path/foo.baz
Run Code Online (Sandbox Code Playgroud)

然后mv使用这两个参数运行。有关大括号扩展的更多信息,请参阅http://wiki.bash-hackers.org/syntax/expansion/brace

  • 那是光荣的。我不知道你能做到这一点。 (3认同)

ste*_*ver 5

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

  • ! 引入历史扩展
  • # 表示当前命令的事件指示符
  • $ 指代最后一个参数的单词指示符

您可以使用类似 sed 的s/pattern/replacement语法对扩展执行替换,例如

somecommand path/to/foo.bar !#$:s/.bar/.baz
Run Code Online (Sandbox Code Playgroud)

前任。

$ 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'
Run Code Online (Sandbox Code Playgroud)

如果您想要特定的路径(例如,指向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'
Run Code Online (Sandbox Code Playgroud)

对于其他选项,包括readline用于提取最后一个参数的组合键,请参阅如何在 bash 控制台上重复当前输入的参数?


dan*_*jjl 3

带变量

  1. 将目录保存在变量中:`DIR=./really/long/path/
  2. 使用移动: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

  • 最好在最后一行中使用“&&”。否则,如果“cd”失败,“mv”将在错误的目录中运行,可能会覆盖文件。使用 `cd ./really/long/path && mv foo.bar foo.baz` 时,仅当 `cd` 成功更改目录时才会运行 `mv`。 (2认同)

sha*_*anu -3

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

alias src='/directory/name/of/source'
alias dst='/directory/name/of/destination'
mv src dst
Run Code Online (Sandbox Code Playgroud)

  • -1 `alias test='/var/log' ; cd test` 给出 `-bash: cd: test: No such file or directory`。 (2认同)