bash是否有目录历史记录?


26

是否有类似bash的反向搜索历史记录(Ctrl-r)的内容,但仅适用于目录?

我想跳到一些深层文件夹层次结构,因此我想使用诸如反向搜索历史记录之类的方法,但它只查找文件夹名称并提供绝对路径。

本质上,它会产生与使用!?但只匹配前面带有cd的命令的结果相似的结果,您可以逐步浏览结果和完整路径。

到目前为止,我发现的最佳解决方案是bashmarks


1
我最近开始使用z,到目前为止似乎还可以,但是我将其用于一些路径。
罗布

Answers:


11

看一下autojump

最常用的shell命令之一是“ cd”。在我的朋友中进行的一项快速调查显示,他们键入的所有命令中有10%到20%实际上是cd命令!不幸的是,使用cd从系统的一部分跳到另一部分需要您输入几乎完整的路径,这不是很实际,并且需要大量的击键。

自动跳转是浏览文件系统的一种更快的方法。它通过维护命令行中最常用的目录的数据库来工作。jumpstat命令向您显示数据库的当前内容。您需要做一些工作才能使数据库可用。数据库合理完成后,您可以通过键入以下内容“跳转”到通常为“ cd”的目录:
j dirspec


这可能会导致终端标题出现问题。
丹尼尔·贝克

6

cd -

这是“ cd [space] [hyphen]”命令,它转到您之前的目录,本质上是“深度为1的历史记录”。重复的“ cd-”在两个目录之间来回切换。

引用手册页:

应支持以下操作数:[...]

当[连字符]用作操作数时,这应等效于以下命令:

      cd "$OLDPWD" && pwd

不幸的是,我不知道真正的内置目录历史记录。


pushd dir popd一对可以存储您的目录历史记录堆栈。这对在不同文件夹中运行的脚本很有帮助。
2015年

我知道pushdpopd,这里也已经提到过。
apurkrt

3

bash已推送/ popd / dirs。我的.bashrc中有此文件,可将目录自动推送到bash的堆栈中。

#let cd also pushd directories into stack. Use popd to reverse stack
function cd ()
{
  if [ -e $1 ]; then 
    pushd $1 &> /dev/null   #dont display current stack 
  fi
}

使用弹出这些文件,popd并使用显示该堆栈dirs


2

我在z-jump上有很好的经验,它可以完成,尽管仅适用于最终目的地,而不是单步执行。但是,它会在制表符完成时显示完整路径。


1

只是为了亲身体验,我前段时间编写了一个简单的脚本来满足此要求,它用一个简单的函数覆盖了内置的cd命令,该函数将新的目录位置附加到历史文件中,然后使用python脚本提供一个bash界面,当您输入搜索词时,该界面会动态更新目录的有序列表,有点像bash的反向命令搜索。

那些好奇的人可以在git-hub上找到它。


变速箱上的岩石
Darth Egregious

1

我想推荐我ltcd快速浏览目录历史记录:

https://github.com/dczhu/ltcd

cd演示gif

它提供以下功能以使生活更轻松:

  • 全球目录列表,显示所有终端标签/窗口中最近访问的目录。
  • 本地目录列表,对于当前Shell会话是本地的。
  • 两种清单都支持通过使用j / k(向下/向上),数字和单词搜索进行快速导航。
  • 全局自由跳转(例如,“ cd dir”或“ cd ar”转到/ path / to / foo / bar / directory /)。

1

我制作了一个脚本,其功能类似于在bash上运行的oh-my-zsh的dirs -v命令。如果您曾经使用过oh-my-zsh,您可能已经注意到,dirs -v每次退出终端时,将重置命令提供的目录历史记录。但是,如果使用此脚本,则不会发生。

功能:

  • 使用来显示最近使用的10个目录的列表d

  • 通过输入列表中的目录号跳到列表中的任何目录。您需要使用0而不是10来跳到第十个目录。

  • 每次您使用vvim)编辑文件或使用oxdg-open)从该目录打开文件时,目录路径都会放在列表的顶部。或者,如果您愿意,每次访问目录时。

您可以在此处查看它的运行情况。


0

好的,您可以将此代码段添加到~/.bashrc

  1. 提供自定义cd命令

        function cd ()
        {
            exists=false
            for dir in "${CDHIST[@]}"; do
                [ "$dir" == "$1" ] && {
                    exists == true
                    break
                }
            done
    
            $exists || {
                len=${#CDHIST[@]}
                ${CDHIST[$len]} = "$1"
            }
    
            builtin cd "$1"
        }
  2. 并提供cd历史记录搜索命令。

    function cdhist ()
    {
        #TODO: Make this magical.
    
        for dir in "${CDHIST[@]}"; do
            echo "$dir"
        done
    }

当然,我提供的cdhist命令是非常基本的,而不是您想要的。但是可以考虑使用case语句或参数扩展来实现与您想要的功能类似的功能。

您甚至可以添加一些“可编程完成”功能,该功能可用于cd /path/to/mydir基于的唯一子字符串添加完整命令/path/to/unique/mydir,尽管该方法仍然需要您键入cd unique/mydir<tab>


1
我误读了您的代码,发现bash的dirs命令与基本上具有相同的功能my_dirs,但只在一行上。
idbrii 2011年

1
凉。因此,bash不仅支持它。它实现了它。我希望我有更多的时间研究bash的深层魔术。当然,这仅支持记忆推送,而不是cd。但我想alias cd=pushd这将是最优雅的形式。
2011年

0

你可以建立自己的cd使用命令pushdpopddirs 内置命令。

用法

  • cd -- (列出当前历史记录)

  • cd -num (转到num目录)

  • cd - (转到上一个目录)


function cd()
{
    local hnum=16  # number of entries
    local new_dir index dir cnt
    if ! [ $# -eq 0 ]; then
        if [[ $# -eq 2 && $1 = "--" ]]; then
            shift
        else 
            if ! { [ $# -eq 1 ] && [[ $1 =~ ^(-[0-9]{,2}|-|--|[^-].*)$ ]] ;}
            then
                builtin cd "$@"
                return
            fi
        fi
    fi
    [ "$1" = "--" ] && { dirs -v;  return ;}
    new_dir=${1:-$HOME}
    if [[ "$new_dir" =~ ^(-[0-9]{,2}|-)$ ]]; then
        index=${new_dir:1}
        [ -z "$index" ] && index=1
        new_dir=$(dirs -l +$index) || return
    fi
    pushd -- "$new_dir" > /dev/null || return
    popd -n +$hnum &> /dev/null
    new_dir=$PWD cnt=1
    while dir=$(dirs -l +$cnt 2> /dev/null); do
        if [ "$dir" = "$new_dir" ]; then
            popd -n +$cnt > /dev/null
            continue
        fi
        let cnt++
    done
}

export -f cd

-1

我将这个工具放在一起,它将以前的解决方案(用于存储全面的全局CLI历史记录)与称为percol(映射到C ^ R)的交互式grepping工具结合在一起。我用它来检索命令的运行位置或通过命令查找目录。在我开始使用它的第一台机器上,它仍然很光滑,现在具有超过2年的CLI历史。

grep工具可同时在路径和命令上使用,但可能对您仍然有用。另请参见zsh中的“ dirs -v”

https://github.com/gawells/ariadne


它将存储带有路径,命令和日期的CLI历史记录。它不是仅路径,但对于反向搜索目录历史记录(bash和zsh)仍然有用
Gordon Wells

我认为您忘了链接到您的工具。根据您的描述,我怀疑它的不足之处在于命令仅在调用它们的地方起作用。因此,cd share/man仅当我已经在/ usr中时,此方法才有效。
idbrii

哎呀!不好意思,我以为我会在网址中输入url,却没有注意到出了什么问题
Gordon Wells
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.