将目录更改为移动操作的目标

将目录更改为移动操作的目标

偶尔,我编辑了一些文件,想将其移动到其他文件夹。(通常是:移动到 Dropbox 文件夹,我不想在那里工作,以免让文件夹的其他所有者不断收到更新。)例如,我使用

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

之后,我经常发现自己想将目录更改为上一次移动操作的目标目录。我发现自己按下向上箭头,删除最后一个file.pdf,按住左箭头,删除mv file.pdf并替换为cd

有没有更快、更智能的方法来做到这一点?是否有“移动文件然后更改目录”命令,或者上次使用的目录的快捷方式,或者类似的东西?

答案1

如果你正在使用 bash,那么它的历史交互就有这个快捷方式。字标识符对于上一个命令的最后一个参数:

!!:$
指定前一个命令的最后一个参数。这可以缩写为!$

结合修饰符删除最后一个路径名部分:

在可选的单词指示符之后,您可以添加一个或多个有效修饰符,每个前面都有一个“:”。

h
删除尾随路径名部分,仅留下头部。

所以:

$ echo /ab/c/d
/ab/c/d
$ echo !$:h
echo /ab/c
/ab/c

相同的快捷方式也可以用于 zsh。

答案2

如果您不想更改文件名,则可以省略它,mv 将自动添加它;这在移动多个文件时特别有用:

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/

mv *.pdf ../../../Dropbox/sharedfolder/subdirectory/

使用目录作为最后一个参数,您可以使用!!:$或,!$正如 muru 的回答所述。
如果您使用具有通常默认值的 bash,则可以使用Alt+.而是。
(这是 readlineinsert-last-argument命令;bind -p将列出所有当前绑定。)

答案3

另一种方法是创建专用于此目的的命令。这可以通过以下方式完成功能看起来像这样:

$ function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }

在哪里:(1) mv-special是函数名称;(2)变量$1$2是函数中的参数,将被命令mv和使用cd(3) $(echo $2-)在 var 中的字符串末尾添加一个通配符$2,并修复了dirname如果变量$2只包含路径;(4) $(dirname $(echo $2-))将仅过滤来自的路径$2

根据这个答案该函数可能看起来像:

$ function mv-special { mv $1 $2; cd ${2%/*}; }

其中:${2%/*}将仅过滤来自的路径$2

要作为命令使用,此功能必须出口

$ export -f mv-special

用法:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

或者:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/

请注意 - 对于两种变体 - 第二个参数($2)必须以文件名或斜杠(/)结尾。

为了使我们的新命令永久可用,必须将函数的定义和导出命令附加到~/.bashrc

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }
export -f mv-special

或者:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd ${2%/*}; }
export -f mv-special

在此处输入图片描述


可以创建自定义命令并通过放置在~/bin以下位置的可执行脚本文件执行/usr/sbin如何创建自定义终端命令(运行脚本)?但说实话,我面临着麻烦cd与此场景中的行为一致。

相关内容