cp 或 mv 文件到它们已经在的同一目录中,当我在另一个目录中时?

Mic*_*ant 12 command-line cp rename

如果我在里面~/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
Run Code Online (Sandbox Code Playgroud)

是否有任何快捷方式可以让我输入更短的内容,使用第一个参数中的目录路径(虽然不是我的当前目录),例如

mv blob/a_long_directory_name/c/x.x $same_dir/y.y
Run Code Online (Sandbox Code Playgroud)

$same_dir这样的东西会指向 param 1 的目录

iru*_*var 27

使用 bash,您可以使用大括号扩展

mv blob/a_long_directory_name/{c/x.x,evenmore/y.y}
Run Code Online (Sandbox Code Playgroud)


Ala*_*tko 8

为了最大限度地减少打字量,分两步完成可能是最简单的。CD 到目录,然后移动。

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

$ (cd blob/a_long_directory_name/c/ && mv x.x y.y )
Run Code Online (Sandbox Code Playgroud)

这意味着cd只会在子shell中生效,mv只有在cd成功时才会发生,并且当前shell的工作目录不会改变。

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

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd
Run Code Online (Sandbox Code Playgroud)


Woj*_*tek 5

您可以使用 shell 的文本替换功能。在 中bash,你可以使用像这样的野兽:

mv blob/a_long_directory_name/c/xx !#:$:gs^c/xx^evenmore/yy
Run Code Online (Sandbox Code Playgroud)

分解:

!# 是目前输入的行

:$要求选择正在考虑的字符串的最后一个单词(替换为数字n以选择n第 'th 个单词)(!#在本例中)。到目前为止键入的行的最后一个单词将是前一个单词。

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

这种方法稍微更通用,因为它允许您用任何其他单词 ('yy') 替换路径 ('xx') 的任何部分。

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

shopt -s histverify
Run Code Online (Sandbox Code Playgroud)

按下回车后将显示编辑的行,因此您仍然可以编辑它并检查错误。

为什么你会使用这样的构造我不确定,但它在这种情况下有效。