cp或mv文件到我在另一个目录时已经在的目录中?


12

如果我在~/blob并且有文件在~/blob/a_long_directory_name/c/x.x

我可以打字

mv blob/a_long_directory_name/c/x.x blob/a_long_directory_name/even_more/y.y

有没有什么捷径可让我键入较短的内容,而它使用第一个参数中的目录路径(不过不是我当前的目录),例如

mv blob/a_long_directory_name/c/x.x $same_dir/y.y

像这样$same_dir将指向参数1的目录

Answers:


8

为了最大程度地减少键入量,可能最容易分两步进行。CD到目录,然后移动。

如果只有一个命令,则可以使用子shell:

$ (cd blob/a_long_directory_name/c/ && mv x.x y.y )

这意味着cd将仅在子外壳中生效,mv仅在cd成功之后才会发生,并且当前外壳的工作目录不会更改。

如果您有多个命令,请使用目录堆栈。

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd

这没有解决even_more相对路径...
无用的

那是对的。$ same_dir示例似乎也忽略了它。
艾伦·舒特科

+1我喜欢。很容易记住,做,这是关键,我
迈克尔·达兰特

有趣,因为它不能满足您的要求。也许您的问题不完全是您的意图?
无用的2013年

没用,我更新了标题以阐明它与cp / mv文件有关,即使我在另一个目录中,也将它们保存在同一目录中。顺便说一句,您的用户名很可爱,但是在其中使用时却使评论看起来很愚蠢:)
Michael Durrant


5

您可以使用外壳程序的文本替换功能。在中bash,您可以使用像这样的野兽:

mv blob/a_long_directory_name/c/xx !#:$:gs^c/xx^evenmore/yy

分解:

!# 到目前为止输入的当前行是

:$要求选择nn考虑的字符串的最后一个单词(用数字代替,选择第一个单词)(!#在这种情况下)。到目前为止键入的行的最后一个单词将是前一个单词。

:gs^xx^yy在结果字词上进行全局(g)文本替换(s),将“ xx”替换为“ yy”。^只是s命令的分隔符,以允许/您在模式中使用该命令。

此方法稍微通用一点,因为它使您可以用其他任何单词('yy')替换路径('xx')的任何部分。

最后,像任何历史操作一样,最好设置适当的shell选项(例如in中~/.bashrc)。在这种情况下

shopt -s histverify

在按回车键后将显示已编辑的行,因此您仍然可以对其进行编辑并检查错误。

我不确定为什么要使用这样的构造,但是在这种情况下它是可行的。


a)线路噪声太多(与大括号扩展相比)b)无法解决OP的问题:他们希望c/x.x通过evenmore/y.y保留原始路径前缀来代替它。
Joseph R.

您的第二个评论是我的一个简单疏忽,需要进行简单的编辑才能解决。我不认为这个答案应该被否决。使用edit(技术性),它确实解决了问题,并且更通用,因为它允许交换路径的任何部分(我经常在上使用类似的内容$PWD)。当然,这也许不是最优雅的方法,但它指出了这样一个事实:shell确实具有文本替换和单词指示符,某些用户可能仍认为这些替换符对研究有用。
Wojtek

好。我站得住了。
Joseph R.
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.