命令行移动具有长目录路径的文件而不重复目录路径
有没有办法在没有在第二个参数中键入完整路径的情况下执行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
带变量
- 将目录保存在变量中:
`DIR=./really/long/path/
- 使用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
更改目录
- 您也可以
cd
到您想要使用的目录:cd ./really/long/path
- 然后更改文件名:
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