如果我在~/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
按回车键后将显示编辑的行,因此您仍然可以编辑它并检查错误。
我不确定为什么要使用这样的构造,但在这种情况下它是有效的。