如果我想将一个名为longfile
from 的文件移动/longpath/
到 to/longpath/morepath/
我可以做类似的事情吗
mv (/longpath)/(longfile) $1/morepath/$2
即我可以让 bash 知道它应该记住输入的特定部分,以便我以后可以在同一输入中重用它吗? (在上面的示例中,我使用一个虚构的记忆命令,该命令通过括在括号中来工作,以及一个虚构的重用命令,$
该命令插入组的内容)
答案1
你可以做这个:
mv /longpath/longfile !#:1:h/morepath/
看https://www.gnu.org/software/bash/manual/bashref.html#History-Interaction
!#
是当前命令:1
是该命令中的第一个参数:h
是“头”——思考dirname
/morepath/
将其附加到头部- 并且您将文件移动到目录,因此它保留相同的基本名称。
如果您想更改“长文件”名称,例如添加“.txt”扩展名,您可以
mv /longpath/longfile !#:1:h/morepath/!#:1:t.txt
就我个人而言,我会用鼠标进行剪切和粘贴。在实践中,我从来没有比!!
or !$
or更复杂的!!:gs/foo/bar/
答案2
您也可以通过大括号扩展来做到这一点:
mv /longpath/{,morepath/}longfile
shell 对此进行了扩展,以便mv
命令将其视为与以下内容相同:
mv /longpath/longfile /longpath/morepath/longfile
答案3
如果您想在命令行中更有效地输入,您可能会发现各种阅读行快捷方式有用。 Readline 已经内置在您的 shell 中。对于您的特殊情况,您可以猛拉/删除部分行,然后从 readlinekilliring 中召回它们。
此外,如果您将 EDITOR 环境变量设置为您最喜欢的编辑器,那么 Ctrl-X、Ctrl-E 会将您当前的命令行复制到编辑器窗口中,您可以在其中拥有所有编辑器权限来修改您的行。完成后,保存/退出编辑器,该行将在 shell 中执行。
答案4
对于您所询问的具体情况,您还可以使用子 shell。
mv (/longpath)/(longfile) $1/morepath/$2
变成
( cd /longpath; mv longfile morepath/ )
同时将当前工作目录保留在您正在使用的 shell 中。
这并不完全不同于通配符使用shell扩展的建议但可以用于比仅在一个论证中的简单事物可以轻松支持的更复杂的情况。