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)
为了最大限度地减少打字量,分两步完成可能是最简单的。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)
您可以使用 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)
按下回车后将显示编辑的行,因此您仍然可以编辑它并检查错误。
为什么你会使用这样的构造我不确定,但它在这种情况下有效。