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

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

如果我在~/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 的目录

答案1

通过 bash,你可以使用大括号扩展

mv blob/a_long_directory_name/{c/x.x,evenmore/y.y}

答案2

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

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

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

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

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

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

答案3

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

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

分解它:

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

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

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

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

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

shopt -s histverify

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

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

相关内容