如何通过 CLI 快速进出深度嵌套的目录?

gst*_*ina 18 command-line bash directory

我们知道 usingcd <directory>会打开目录,如果它存在的话!

此外,cd ..将从当前工作目录带我们上一层。

但是,当我们有一个带有更长路径的嵌套目录时/home/thina/teams/td/tech/app/release/apks,进入文件夹很累apks,也很难回到另一个节点,比如这里/home/thina/teams

有没有办法跳过的打字cdcd ..?我正在使用 Ubuntu 16.04。

Jos*_*Jos 33

pushdpopd

pushd /home/thina/teams/td/tech/app/release/apks
# current directory now /home/thina/teams/td/tech/app/release/apks
popd
# current directory now what it was before pushd command
Run Code Online (Sandbox Code Playgroud)

尝试help pushdhelp popd更多的选择。没有man页面,因为pushdpopd是 bash 内置命令。

  • 不要忘记 `dirs` 在 `pushd`/`popd` 命令中列出你的目录堆栈。 (8认同)
  • `cd -` 不会做同样的事情吗? (5认同)
  • @edwinksl 是的,但是 `pushd` 和 `popd` 可以记住不止一个以前的路径。 (5认同)
  • 这些在 bash-builtins(7) 的手册页中都有介绍,因为它们是 bash 内置命令。(或者它们也可以在 [bash](http://linux.die.net/man/1/bash) 的完整手册页中找到)它与 `help pushd` 和 `help popd` 的信息相同你提到了(以及“帮助目录”),但我想我会提到,以防人们想知道这些命令来自哪里。 (4认同)
  • @Jos 你拼错了 `help pusdh` (2认同)

Arr*_*cal 17

除了已经提供的非常好的答案之外,这里还有一些关于cd有效使用的提示。

  • cd - 将带您回到您所在的最后一个目录。
  • cd ../../..将一次带您上 3 个级别,您可以使用..链接在一起的符号“上移”任意数量的 目录。
  • 如果您不确定要向上移动多少次,请使用cd ..,然后通过按下箭头键再次使用该命令来使用 bash 历史记录。
  • 使用~在静置当前用户的主目录,如果你在为用户thina登录,cd ~/teams将带你到/home/thina/teams
  • 对路径使用 Bash 自动补全,tab 键将补全cd命令中的一段路径,如果您键入路径段的一部分,后跟Tab,则该段将在没有其他有效选择的情况下补全。例如,如果您输入cd /home/thina/teams/td/t然后按下Tab,那么只要 td 目录中没有以字母 t 开头的其他文件或目录,就会为您填写 tech 一词。

一起使用这些技巧可以使遍历目录的cd痛苦少得多。

  • 再加上`~`,特别是如果你是root 用户,`~user` 会很快把你带到`user` 的主目录。 (2认同)

par*_*ras 9

要一次在树中上升多个级别,您可以使用以下功能(感谢 muru 的增强版本):

up ()
{
    local old="$PWD"
    for i in $(seq "${1:-1}"); do
        cd ..
    done
    OLDPWD="$old"
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

$ pwd
/home/thina/teams/td/tech/app/release/apks
$ up 5
cd'ing into /home/thina/teams
Run Code Online (Sandbox Code Playgroud)

此外:

  • up不带参数调用相当于cd ..由于${1:-1}哪些替代品$1时集和1以其它方式
  • 在最后一个之后设置 OLDPWDcd ..旨在保留通常的cd -行为。

  • 建议:`-gt` 而不是 `&gt;`。`&gt;` 是字典式的,它作为字符串进行比较。此外,与其构建路径,不如在循环中执行 `cd ..`: `for i in $(seq "${1:-1}"); 光盘..; 完成`?这也可以消除“if”条件。 (2认同)

Ser*_*nyy 7

对于长目录名称,请使用具有完整路径的变量。例如,

APKS="/home/thina/teams/td/tech/app/release/apks"
Run Code Online (Sandbox Code Playgroud)

然后你可以做 cd "$APKS"

至于上升 x 个目录,我在我的 .bashrc

goup() # go up x number of dirs
{
  num=$1
  while [ $num -ne 0  ];do
    cd ..
    num=$( expr $num - 1   )
  done
}
Run Code Online (Sandbox Code Playgroud)

/home/thina/teamsapks你那里回来会做

goup  6
Run Code Online (Sandbox Code Playgroud)

下面是一个使用示例:

$> pwd
/sys/class/backlight/intel_backlight
$> goup 3
$> pwd
/sys
$> 
Run Code Online (Sandbox Code Playgroud)

我想出的另一个小功能,但从来没有使用过这么多的bookmark功能。

这是它的工作原理:它将您当前的文件夹保存到某个文件,然后您可以根据该文件中的行号 cd 到特定目录。例子:

$> cd /etc/lightdm
$> bookmark
$> cat ~/.dirsbookmarks                                                                                                  
/home/xieerqi
/sys/class/backlight
/etc/lightdm
$> cd $( awk 'NR==2' ~/.dirsbookmarks  )                                                                                 
$> pwd
/sys/class/backlight
Run Code Online (Sandbox Code Playgroud)

这是函数本身:

bookmark()
{ # bookmarks current dir
  pwd >> $HOME/.dirsbookmarks
}
Run Code Online (Sandbox Code Playgroud)


Cip*_*agă 5

更新:有一个比autojump:更强大的工具fasd,但我不熟悉它。


我很惊讶还没有人提到autojump哪个

通过从命令行维护您最常使用的目录的数据库来工作(必须首先访问目录,然后才能跳转到它们。)

这基本上是@graipher 构建的,还有一些额外的选项。

正如我在另一个问题中提到的

在你 cd 几次到一个目录之后(即使一次就足够了):

cd /home/thina/teams/td/tech/app/release/apks

您可以使用快捷方式j快速移动到那里,无论您当前在哪个目录中:

j apks

请注意,使用路径的任何部分都有效,只要它是列表中的最高部分: 如果您去那里的次数多于 to ,j app也会带您.../apks.../app

我会推荐它而不是拥有自己的脚本,因为它维护良好,为 Ubuntu 分发,并且具有其他简洁的功能,例如跳转到 child

.../td/tech $ jc apk
.../release/apks $ 
Run Code Online (Sandbox Code Playgroud)

已将您移至apksin td,而不是另一apks棵树下的其他一些。


小智 5

别名

我有一个通过别名直接可用的常用目录列表。这还包括层次结构中目录的快捷方式。

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias cdwork=/home/knub/Repositories/work
alias cduni=/home/knub/University
Run Code Online (Sandbox Code Playgroud)

现在,当我想要上三个级别时,我只需输入即可....<Enter>