有没有一种方法cd
可以让命令接受常规文件路径并跳转到该文件所在的目录?
你可以做的图像:
vim /usr/share/drupal7/sites/all/modules/legacy/legacy.module cd <alt>+<.> # for last command argument git add <alt>+<.>
很乐意
答案1
这是一种输入量少一点的方法,但你需要小心一点。它涉及!$
历史引用(jcbermu 也使用过),这意味着最近命令的最后一个字。(这在大多数 shell 中都可用:当然bash
,csh
和tcsh
。)附加:h
修饰符以删除尾随的文件名组件,只留下Head,你的命令是cd !$:h
。
在以下示例中,粗体文本就是您输入的内容:
~ $vim /usr/share/drupal7/sites/all/modules/legacy/legacy.module (编辑文件) ~ $光盘 !$:h cd /usr/share/drupal7/sites/all/modules/legacy /usr/share/drupal7/sites/all/modules/legacy $
它可以处理目录名中的空格,直到达到一定程度:
~ $vim /usr/share/drupal7/sites/all/modules/old\ code/legacy.module (编辑文件) ~ $光盘 !$:h cd /usr/share/drupal7/sites/all/modules/old\ 代码 /usr/share/drupal7/sites/all/modules/旧代码 $
或者
~ $vim /usr/share/drupal7/sites/all/modules/“旧代码”/legacy.module (编辑文件) ~ $光盘 !$:h cd /usr/share/drupal7/sites/all/modules/“旧代码” /usr/share/drupal7/sites/all/modules/旧代码 $
/
但是,我认为一个好的普遍说法是,如果文件名中的最后一个被引用,它就会失败:
~ $vim“/usr/share/drupal7/sites/all/modules/旧代码/legacy.module” (编辑文件) ~ $光盘 !$:h cd“/usr/share/drupal7/sites/all/modules/旧代码 >Ctrl+C (Shell 要求输入后续文本 因为它看到一个不匹配的引号字符。)
如果文件位于当前目录中,它也会失败:
~ $vim 遗留模块 (编辑文件) ~ $光盘 !$:h cd 遗留模块 -bash:cd:legacy.module:没有此文件或目录 ~ $ (:H 没有效果,因为 !$ 不包含 /)
但这很简单。如果文件位于当前目录中,则根本不会执行此操作cd
。另一个问题是,如果您将文件名放入变量中:
~ $fn=/usr/share/drupal7/sites/all/modules/legacy/legacy.module ~ $vim“$fn” (编辑文件) ~ $光盘 !$:h cd“$fn” -bash:cd:/usr/share/drupal7/sites/all/modules/legacy/legacy.module:不是目录 ~ $ (:H 没有效果,因为 !$ (即 “$fn”)不包含 /)
您可以按如下方式处理:
~ $fn=/usr/share/drupal7/sites/all/modules/legacy/legacy.module ~ $vim (编辑文件) ~ $cd“${fn%/*}” /usr/share/drupal7/sites/all/modules/legacy $
正如其他答案所建议的,使用.
或"$PWD"
作为git add
命令。
答案2
两个步骤:
创建一个包含的 shell 脚本“cdfile” cd "$(dirname "$1")"
,使其可执行,并将其放在可以找到它的地方。
现在使用
vim /usr/share/drupal7/sites/all/modules/legacy/legacy.module
cdfile <alt>+<.> # for last command attribute
git add .
答案3
有一种方法可以从文件名中提取目录名称,它被称为 dirname
cd `dirname /your/file/path`
答案4
cd
这是进入二进制目录的一种快速而又肮脏的方法......
> cd "$(dirname "`which bash`")"