bash shell 中的快速目录导航

sai*_*y2k 128 command-line shell bash alias cd-command

我想经常在完全不相关的路径中的目录之间切换,例如/Project/Warnest/docs/~/Dropbox/Projects/ds/test/

但我不想一直打字cd /[full-path]/。是否有任何快捷命令可以切换到以前工作过的目录?

我能想到的一种解决方案是将环境变量添加到我bash .profile的常用目录中,cd并使用这些变量添加到它们中。

但是有没有其他解决办法呢?

Chr*_*ard 142

如果您只是在两个目录之间切换,则可以使用cd -来回切换。

  • 这么久以来,这对我来说是个谜,这是一个谜。非常感谢您提供这个出色的提示。 (14认同)
  • +1 当然是我的最爱之一,也是许多专家“错过”的一种。 (3认同)

man*_*ork 64

CDPATHbashandkshcdpathin 中有一个 shell 变量zsh

CDPATH    The search path for the cd command. This is a colon-separated
          list of directories in which the shell looks for destination
          directories specified by the cd command.
Run Code Online (Sandbox Code Playgroud)

所以你可以在你的 ~/.bashrc 中设置:

export CDPATH=/Project/Warnest:~/Dropbox/Projects/ds
Run Code Online (Sandbox Code Playgroud)

然后cd docscd test将带您到第一个找到的此类目录。(我的意思是,即使当前目录中存在同名目录,CDPATH仍然会被查询。如果CDPATH将包含更多具有给定名称的子目录的目录,将使用第一个。)

  • 应该提到的是,一般来说,你会希望`$CDPATH` 中的第一个条目是`.`(一个明确的条目,即`:` 也可以)。否则你最终会出现奇怪的行为,其中`CDPATH` 目录优先于当前工作目录中的目录,你可能不希望这样。 (16认同)
  • 我做了几乎相同的事情,但没有“导出”。这样,`CDPATH` 就不会导出到具有潜在怪异或有害影响的脚本中。有关更多讨论和示例,请参见 [此处](http://news.ycombinator.com/item?id=2237911)。 (4认同)

小智 52

您可以尝试的其他工具是名为autojump的工具。它保存了一个调用它的别名的数据库(j默认情况下),并尝试对你想去的地方做出明智的决定。例如,如果您经常键入:

j ~/Pictures
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法在紧要关头到达那里:

j Pic
Run Code Online (Sandbox Code Playgroud)

它可Debian和Ubuntu,以及包含在每个用户的基础上的~/.bashrc~/.zshrc默认。

  • Autojump 可能是最好的工具,它需要一点时间来建立常用目录的数据库,但是一旦建立起来,我想你会发现没有它你就活不下去。我知道每次我在别人的电脑上时,我都觉得自己瘫痪了。 (5认同)

Use*_*ess 41

如果是少量目录,您可以使用pushd它们在它们之间旋转:

# starting point
$ pwd
/Project/Warnest/docs
# add second dir and change to it
$ pushd ~/Dropbox/Projects/ds/test
~/Dropbox/Projects/ds/test /Project/Warnest/docs
# prove we're in the right place
$ pwd
~/Dropbox/Projects/ds/test
# swap directories
$ pushd
/Project/Warnest/docs ~/Dropbox/Projects/ds/test
Run Code Online (Sandbox Code Playgroud)

不同的是cd -,您可以将它用于两个以上的目录


跟进 Noach 的建议,我现在正在使用这个:

function pd()
{
    if [[ $# -ge 1 ]];
    then
        choice="$1"
    else
        dirs -v
        echo -n "? "
        read choice
    fi
    if [[ -n $choice ]];
    then
        declare -i cnum="$choice"
        if [[ $cnum != $choice ]];
        then #choice is not numeric
            choice=$(dirs -v | grep $choice | tail -1 | awk '{print $1}')
            cnum="$choice"
            if [[ -z $choice || $cnum != $choice ]];
            then
                echo "$choice not found"
                return
            fi
        fi
        choice="+$choice"
    fi
    pushd $choice
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

# same as pushd +1
$ pd 1

# show a prompt, choose by number
$ pd
 0 ~/Dropbox/Projects/ds/test
 1 /Project/Warnest/docs
 2 /tmp
? 2
/tmp ~/Dropbox/Projects/ds/test /Project/Warnest/docs

# or choose by substring match
$ pd
 0 /tmp
 1 ~/Dropbox/Projects/ds/test
 2 /Project/Warnest/docs
? doc
/Project/Warnest/docs /tmp ~/Dropbox/Projects/ds/test

# substring without prompt
$ pd test
~/Dropbox/Projects/ds/test /Project/Warnest/docs /tmp
Run Code Online (Sandbox Code Playgroud)

等等。显然这只是为了在堆栈中旋转而不处理添加新路径 - 也许我应该重命名它。

  • 哦,我知道用于遍历的 `pushd` 和 `popd`,但不是 pushd 可以_旋转_到目前为止使用的内容...... (7认同)

Fel*_*Yan 19

alias在 bashrc 中使用这些 CD。
如:

alias wdoc='cd ~/Project/Warnest/docs'
alias dstest='cd ~/Dropbox/Projects/ds/test'
Run Code Online (Sandbox Code Playgroud)


Eel*_*vex 14

使用“pushd -n ”(假设您使用 bash)。

添加到您的 ~/.bashrc:

pushd -n /Project/Warnest/docs/
pushd -n ~/Dropbox/Projects/ds/test/
Run Code Online (Sandbox Code Playgroud)

然后,

cd ~ 是你的家,

cd ~1~/Dropbox/Projects/ds/test/

cd ~2/Project/Warnest/docs/

您可以使用~1~2以完全相同的方式等~


小智 12

我找到了一个脚本(通常称为 acd_fnch.sh)为我解决了这个问题。有了这个,您可以键入cd --以查看您使用的最后 10 个目录。它看起来像这样:

0  ~/Documents/onedir
1  ~/Music/anotherdir
2  ~/Music/thirddir
3  ~/etc/etc
Run Code Online (Sandbox Code Playgroud)

~/Music/thirddir只是输入cd -2

参考

注意:此脚本最初发布在 linux 公报文章中,可在此处获得:acd_func.sh -- 扩展 bash 的 CD 以保留、显示和访问访问目录名称的历史记录


Woj*_*tek 11

cdable_vars在 bash 中尝试shell 选项。你用 开启它shopt -s cdable_vars

然后你需要设置你的变量export dir1=/some/path。最后cd dir1,等等。然后你可以把它放在你的~/.bashrc里面让它粘住。


Noa*_*ach 8

这里有很多很好的建议。使用哪个取决于您是否有一个小的固定目录列表,或者您是否正在寻找更通用的解决方案。

如果它是一个小的固定列表,设置简单的别名(如 Felix Yan 建议的那样)将是最容易使用的。

如果您正在寻找更通用的解决方案(即许多不同的目录,随时间变化),我会使用 pushd 和 popd(如 Useless 建议的那样)。我个人认为默认的 pushd/popd 很难使用,尤其是当您开始在许多文件夹之间切换时;但是我写了一些调整,让我更容易。将以下内容添加到您的 bashrc:

alias dirs='dirs -v'
pd () 
{ 
    if [ -n "$1" ]; then
        pushd "${1/#[0-9]*/+$1}";
    else
        pushd;
    fi > /dev/null
}
Run Code Online (Sandbox Code Playgroud)
  • 使用pd(作为 的缩写形式pushd)跳转到一个新文件夹,记住您所在的位置。
  • 使用dirs查看保存的目录列表。
  • 使用pd 3跳转到电话号码3。

示例用法:

$ PS1='\w\$ '   ## just for demo purposes
~$ pd ~/Documents/data
~/Documents/data$ pd ../spec
~/Documents/spec$ pd ~/Dropbox/Public/
~/Dropbox/Public$ pd /tmp
/tmp$ pd /etc/defaults/
/etc/defaults$ dirs
 0  /etc/defaults
 1  /tmp
 2  ~/Dropbox/Public
 3  ~/Documents/spec
 4  ~/Documents/data
 5  ~
/etc/defaults$ pd 2
~/Dropbox/Public$ dirs
 0  ~/Dropbox/Public
 1  ~/Documents/spec
 2  ~/Documents/data
 3  ~
 4  /etc/defaults
 5  /tmp
~/Dropbox/Public$ pd 4
/etc/defaults$ dirs
 0  /etc/defaults
 1  /tmp
 2  ~/Dropbox/Public
 3  ~/Documents/spec
 4  ~/Documents/data
 5  ~
/etc/defaults$ pd 3
~/Documents/spec$ popd
~/Documents/data ~ /etc/defaults /tmp ~/Dropbox/Public
~/Documents/data$ 
Run Code Online (Sandbox Code Playgroud)


Ulr*_*arz 7

以下似乎适用于我对其进行测试的一种情况,您可以将目录名称作为符号链接放在 ~/Bookmarks 中:

mkdir "$HOME/Bookmarks"
ln -s /tmp "$HOME/Bookmarks/testdir"

function ccd() { cd $(readlink "$HOME/Bookmarks/$1") ; }

ccd testdir && echo $PWD
# gives /tmp
Run Code Online (Sandbox Code Playgroud)


小智 7

你可以做得比尝试j2更糟糕。

从自述文件:

花费大量时间在复杂的目录树上进行 cd-ing?

j 会跟踪您去过的地方以及您在那里度过的时间,并提供了一种跳转到您实际使用的目录的便捷方式。

我广泛使用它并推荐它。


pol*_*mon 6

我建议使用zsh,该 shell 作为目录、文件甚至大多数 cli 程序选项的非常好的 TAB 补全。

我已经使用该外壳多年了,如果它消失了,我会想念它的功能。编写 zsh 脚本也很有趣,有大量的单行代码可以每天为您提供帮助。


小智 6

根据我的经验,在 shell 中导航的最大加速是使用其历史搜索功能。在 Bash 中,您可以通过按Ctrl+R并输入某种模式在命令历史记录中向后搜索。然后将该模式与历史记录中的先前条目进行匹配——可能是cd命令或其他操作——并在您键入时提出建议。只需按 Enter 即可再次运行建议的命令。这reverse-search-history在 Bash 中被调用,我喜欢它。它为我节省了很多击键次数并节省了我的内存。

这是一件好事,因为您只需要记住命令的一些较小部分,例如DropWa区分两个历史条目cd ~/Dropbox/Projects/ds/test/cd /Project/Warnest/docs/.


rei*_*mai 6

我也使用这些别名(将它们添加到 ~/.bashrc):

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
Run Code Online (Sandbox Code Playgroud)

和他们一起去上层目录要快得多(但它只解决了一半的导航)。


And*_*hel 5

如果您使用的是 zsh:

  • 您不必输入cd,只需输入目录路径(/foo/bar/baz<Enter>等于cd /foo/bar/baz<Enter>

    需要auto_cd设置选项

  • 您可以使用Tab键扩展缩写路径(/u/sh/pi<Tab>扩展为/usr/share/pixmaps; 也适用于文件名)

  • Bash 4 获得了 `shopt -s autocd`,因此它不再是 zsh 独有的优点。 (3认同)