如何更改到上一个目录而不是上去?

Yit*_*hak 220 unix shell

我目前花了很多工作时间在两条路径之间来回移动,这些路径离树很远,并且在根部相互转移。让我吃惊的是,如果有一个参数cd将用户带到他们所在的最后一个目录,我的生活会容易得多。

也就是说,如果我在:

/etc/foo/bar/baz/moo
Run Code Online (Sandbox Code Playgroud)

然后输入:

cd /var/lib/fubarred_app/blargh/logs
Run Code Online (Sandbox Code Playgroud)

我希望能够返回到第一个目录而无需再次键入整个路径。

记忆键不会切断它,因为我在每个地方都使用了足够多的命令,因此返回并找到我想要的路径与自己输入路径一样困难。

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

bry*_*yan 315

命令

cd -
Run Code Online (Sandbox Code Playgroud)

将在大多数主流 shell 上执行您需要的交换,较旧的较长变体是

cd "$OLDPWD"
Run Code Online (Sandbox Code Playgroud)

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


用于cd提及的POSIX 手册页

描述

如果在执行上述步骤的过程中,PWD 环境变量发生了变化,则 OLDPWD 环境变量也应更改为旧工作目录(即调用 cd 之前的当前工作目录)的值。

操作数

  -  当连字符用作操作数时,这应等同于以下命令:

cd "$OLDPWD" && pwd 
Run Code Online (Sandbox Code Playgroud)

它更改为以前的工作目录,然后写入其名称。

  • @Randall,也许您可​​以将所有单独的 shell 评论合并为一个 Voltron-Shell 答案。 (16认同)
  • 请记住,这实际上取决于您使用的外壳,并且由于您没有指定,因此很难给出不存在的“便携式”答案。 (7认同)
  • @sinni 某些口味 *do* 具有 `pushd`,至少它是 `bash` 中的内置函数。 (2认同)

slh*_*hck 104

除了 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 ~
Run Code Online (Sandbox Code Playgroud)

当您popd连续调用3 次时,您会以相反的顺序访问堆栈中的那些目录。同时,堆栈将再次清空。

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

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

charon:~ werner$ popd
-bash: popd: directory stack empty
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 Zsh;它有一个 AUTO_PUSHD 选项,它会自动将cd's压入堆栈。

  • @Wiesław:真的吗?我希望 bash 有那个...当然,我可以将 `cd` 别名为 `pushd`,而且它基本上是一样的。 (5认同)
  • 或者别名 pd 到 pushd 并同时拥有。顺便说一句, pushd (或 pd,如果你给它取别名)本身会交换当前目录和上次推送的目录,基本上完成了 'cd -' 的作用。 (3认同)

hay*_*lci 13

有一些“跳转”程序

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

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

在你的情况下

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

~$ j bla 
/var/lib/fubarred_app/blargh/logs$
Run Code Online (Sandbox Code Playgroud)

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

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

~$ j baz src
/home/me/projects/baz/repository/trunk/src$
Run Code Online (Sandbox Code Playgroud)

...以及更多选择。

~$ 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
Run Code Online (Sandbox Code Playgroud)

  • @Randal:它是如何特定于外壳的?这是一个程序。 (3认同)
  • 我是个白痴。:) 我现在看到了。 (3认同)
  • “j”显然是特定于 shell 的。你没这么说。 (2认同)

小智 10

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

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

a 1
Run Code Online (Sandbox Code Playgroud)

然后:

1
Run Code Online (Sandbox Code Playgroud)


mus*_*usa 10

除了 cd -cd $OLDPWD

您可以通过按下CTRL-R并键入cd您之前输入的命令的几个字母来使用历史搜索。CTRL-R反复按将带来较旧的匹配。

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


Han*_*an5 7

bashmarks可以让你为一系列文件夹添加书签,并通过选项卡完成在它们之间跳转:

要为文件夹添加书签,只需转到该文件夹​​,然后像这样将其添加为书签:

bookmark foo
Run Code Online (Sandbox Code Playgroud)

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

go foo
Run Code Online (Sandbox Code Playgroud)

要查看书签列表:

bookmarksshow
Run Code Online (Sandbox Code Playgroud)

选项卡完成工作,转到 shoobie 书签,只需:

go sho[tab]
Run Code Online (Sandbox Code Playgroud)


Alg*_*ger 5

另一种可能性是只打开两个窗口,一个位于每个目录中。