如何切换到上一个目录而不是上一个目录?


214

我目前的工作时间很多,都是在两条距离很远的树之间来回移动,并且从根本上转移了方向。令我惊讶的是,如果有一个参数cd将用户带到他们所在的最后一个目录,我的生活会轻松很多。

也就是说,如果我在:

/etc/foo/bar/baz/moo

然后输入:

cd /var/lib/fubarred_app/blargh/logs

我希望能够返回第一个目录,而不必再次键入整个路径。

由于我在每个地方都使用了足够的命令,因此回去查找所需的路径与自己键入路径一样困难,因此记忆键不会将其剪断。

有没有简短的命令可以让我转到上一个目录?


8
除了@ bryan的出色答案之外,您还可以考虑为每个路径创建一对别名,以便您可以在提示符下键入以下内容:“ bazmoo”或“ blarghlog” :)
warren

4
您为什么不只使用GNU屏幕

2
哪个壳?那有很大的不同。
兰达·施瓦兹

@沃伦·迪托 那是我做所有事情的首选方式。我现在使用我的计算机的一半有自己的别名... =)
ixtmixilix 2011年

Fasd很棒。看看这个。
majkinetor

Answers:


301

命令

cd -

将在大多数主流Shell上执行您需要的交换,较旧的较长版本是

cd "$OLDPWD"

它将使用包含先前工作目录的环境变量。


对POSIX手册页cd提到:

描述

如果在执行上述步骤期间更改了PWD环境变量,则还应将OLDPWD环境变量更改为旧工作目录(即紧接cd之前的当前工作目录)的值。

经营者

  -   当使用连字符作为操作数时,它应等效于以下命令:

cd "$OLDPWD" && pwd 

它将更改为上一个工作目录,然后写入其名称。


7
请记住,这实际上取决于您使用的外壳,并且由于您未指定,因此很难给出不存在的“便携式”答案。
兰达·施瓦兹

16
@Randall,也许您可​​以将所有单独的Shell注释合并为一个Voltron-Shell答案。
hyperslug

@兰德尔 我正在使用bash。它也可以在ksh和zsh中使用。顺便说一句,我是从1994年的《学习Perl》开始学习编程的,所以请原谅我。:)
Yitzchak

嗯,我用cd $OLDPWD这个。主流的shell提供了一种更短的形式,这很好。
ulidtko 2011年

2
@sinni 确实有某些口味pushd,至少它是内置的bash
slhck 2011年

105

除了bryan的答案外,值得一提的还有pushdand popd,它们像堆栈一样建立目录。在Windows NT上也可以使用。但是,并非在所有Shell中都可用。

例如,我们可以转到三个不同的目录,并且在调用时始终会看到堆栈pushd

charon:~ werner$ pushd Documents/
~/Documents ~

charon:Documents werner$ pushd ../Movies/
~/Movies ~/Documents ~

charon:Movies werner$ pushd ../Downloads/
~/Downloads ~/Movies ~/Documents ~

当您popd连续调用三遍时,您将以相反的顺序进入堆栈中的那些目录。同时,堆栈将再次清空。

charon:Downloads werner$ popd
~/Movies ~/Documents ~

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

charon:~ werner$ popd
-bash: popd: directory stack empty

如果您使用的是Zsh;它具有一个AUTO_PUSHD选项,它将自动将推cd送到堆栈中。


pushed和popd并非在所有shell中都可用。
兰德尔·施瓦兹

5
@Wiesław:真的吗?我希望的bash有这样的......当然,我可以别名cdpushd,并且它会大多是相同的。
克里斯·查拉巴鲁克

3
或别名pd推送到两者都有。BTW推入(或为pd,如果要为其加上别名)本身会交换当前目录和最后推入的目录,实质上完成了cd-的作用。
JRobert

我喜欢这个概念,但从未习惯。
托尔比约恩Ravn的安德森

13

有一些“跳跃”程序

  • 自动跳转(具有基本功能)
  • j2 (显然没有维护某些高级功能)
  • z(具有高级功能的“ j”的维护版本)

这些简化了任何种类的目录导航。您可以通过提供路径的一部分来使用它,并且它可以正常工作。

就你而言

~$ j baz 
/etc/foo/bar/baz/moo$

~$ j bla 
/var/lib/fubarred_app/blargh/logs$

您可以为这些程序分配任何字母,“ j”是传统的:)

j2和z支持多个搜索词,...

~$ j baz src
/home/me/projects/baz/repository/trunk/src$

...以及更多选择。

~$ j -l  # list directories by "frecency"(frequency + recency) score
~$ j -r PATTERN # match by rank only, not recency
~$ j -t PATTERN # match by recency only, not rank

2
“ j”显然是特定于外壳的。你没那么说
兰德尔·施瓦兹

3
@Randal:它是如何特定于shell的?这是一个程序。
Fixee 2011年

3
我是个白痴。:)我现在看到了。
施瓦兹

10

除了 cd -cd $OLDPWD

您可以通过按CTRL-Rcd输入之前输入的命令的几个字母来使用历史记录搜索。CTRL-R反复按会带来较早的比赛。

如果要更改的路径超过两个,则此方法将更加有用。


1
CTRL-R不一定有帮助。您可能已经在/ some / obscure / directory / deep中,完成了“ cd evendeeperdir”,然后转到〜/ somehere / different。
justintime 2011年

1
大!它除了可以提供其他cd帮助外,还可以提供很大的帮助!
Niloct 2011年

9

您可以使用它轻松地为目录创建别名:

a() { alias $1=cd\ $PWD; }

a 1

然后:

1

1
仅在了解别名和功能的外壳上。并非全部。
兰德尔·施瓦兹

所以这会跳过键入alias =零件的内容?hmmmm
Xen2050

6

bashmarks可以让您为一系列文件夹添加书签,并使用制表符补全在它们之间跳转:

要为文件夹添加书签,只需转到该文件夹​​,然后将其添加为书签,如下所示:

bookmark foo

书签将被命名为“ foo”。当您想回到该文件夹​​时,请使用:

go foo

要查看书签列表:

bookmarksshow

选项卡补全有效,只需转到shoobie书签即可:

go sho[tab]

4

另一种可能性是仅打开两个窗口,每个目录中都放置一个。


但是,没有共享的历史记录,如果您定期使用/编辑以前的命令(也许重置会得到它们...?)
Xen2050 '16

@ Xen2050请参阅share_historyzsh中的shell选项。
罗斯登堡

4

我知道这并不是严格意义上的问题答案,但有助于达成将您带到重要目录的目标。

在任何下降的UNIX-bash中,都可以使用CDPATH扩展cd命令在其中搜索的文件夹。

从我的.bashrc文件中:

export CDPATH='.:~/source/'

cd首先在当前文件夹中搜索,然后在我的encoding-project-directory中搜索。

cd myproject

..带我从目前所在的位置到达〜/ sources / myproject

简单的小功能对我的目录导航很有帮助。


1
+1这会将CDPATH文件夹添加到cd的自动完成(TAB)列表中,这很好。但是,如果.不包含,并且CDPATH文件夹中有一个与当前目录中的文件夹同名的文件夹,cd samename则将转到CDPATH目录,而不是当前目录中的那个文件夹,即Bad。必须使用cd ./samename进入dup文件夹。
Xen2050 '16

是的,很好的评论。始终包括第一个,否则您会遇到奇怪的事情。
phareim

3

cd -是的,这是要走的路,但我担心您的外壳缺少电源。 popd而且pushd也很好,那j东西看起来也很好。

我将自己的实用程序付诸东流……这只是我在过去十年左右的时间里一直在与我一起构建,自定义和迁移的东西,并且对我想做的事情也很好用。

我的目录管理实用程序的博客文章

如果它对您有用,那就太好了,但如果不对我保证,您还会得到其他的好处:)您根本不能cd独自生活。


3

如前所述,如果只有2个目录,最简单的方法是:

cd -

当我过去遇到过这样的事情时,我已经做了一些技巧,这可能会有所帮助。

  1. 将别名命令放在.cshrc文件中,就像这样

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. 将快捷方式链接到我的主目录中感兴趣的路径。这是一回事。

    cd ~
    ln -s /var/lib/fubarred_app/blargh/logs blargh
    ln -s /etc/foo/bar/baz/moo
    

这样就可以轻松地更改目录:

   cd ~/moo
   cd ~/blargh

2

Autojump是bash / sh / zsh“ cd”命令,根据您的操作,请观看此视频

因此,在了解了最后一个文件夹后,这将使您陷入困境

j moo

2

光束

我有自己的工具,但也将看看Dereks工具j

当然,来回跳跃的首选是

光盘-

我的工具适用于在系统上具有唯一名称的目录(如果locate有);它搜索匹配的目录名称,并跳入第一个匹配项:

beam () 
{ 
    ldir=$(locate $1 | egrep "$1$" | head -n 1);
    if [[ -d $ldir ]]; then
        echo $ldir;
        cd $ldir;
    else
        echo "no directory "$ldir;
    fi
}

依存关系:

  • 定位
  • grep

缺点:

  • 找不到比上次updatedb运行新的目录
  • 如果有多个目录匹配,则取决于您的运气,是否满足您的需求。

改进/修改:

  • 代替选择第一个目录,可以修改代码以显示选择列表,提示用户输入1,2,3,...转到/ bin,/ usr / bin,/ usr / local / bin ...

用法:

  • 将函数放入/etc/bash.bashrc或〜/ .bashprofile中,以方便使用。

我的解决方案的优势:

  • 不限于2个目录,例如 cd -
  • 使用Beam之前,您不必一次访问目录。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.