bash的“书签”


24

浏览多层嵌套目录通常很麻烦。在Firefox上,这很容易,因为它们具有书签。因此,我想对文件添加书签的方法是键入:

$ go --add classes "repo/www/public/util/classes"

然后,要转到该目录,请输入:

$ go classes

以前,我使用符号链接来实现类似的目的,但是我不想弄乱自己的主目录。还有许多其他功能可能被证明是有用的。例如,我希望能够开始键入go cl,然后点击制表符以自动完成。有时我签出了一个存储库的多个副本,因此该程序允许我创建多个上下文并相对于上下文基础目录设置书签会很有用。

因此,在我开始拼凑自己的一组脚本之前,已经有这样的东西吗?



4
如果您继续将bash与firefox进行比较,那么有人会为bash制作一个棒棒的吧:(
hhaamu 2011年

Answers:


12

我一直在寻找一些贝壳书签工具,但是我对找到的任何解决方案都不满意。

但是,最终我遇到了一个很棒的通用工具:命令行模糊查找器

它主要允许您“模糊查找”文件(通过上面的链接检查Rich gif动画),但它还允许向其输入任意文本数据并过滤该数据。因此,快捷方式的想法很简单:我们所需要做的就是维护一个带有路径的文件(即快捷方式),并对这个文件进行模糊过滤。外观如下:我们键入cdg命令(如果需要,可以从“ cd global”输入),获取我们的书签的列表,在几次按键中选择所需的书签,然后按Enter。工作目录已更改为选择的项目:

光盘

它非常快速且方便:通常我只键入所需项目的3-4个字母,其他所有字母都已被过滤掉。另外,当然,我们可以使用箭头键或Ctrl+j/ 在列表中移动Ctrl+k

有关此快捷方式/书签解决方案的详细文章,位于:Shell的模糊快捷方式


19

我认为您正在寻找类似autojump之类的东西。您必须进行一点CD操作才能开发出一组与给定目录花费的时间相关的“键权”。然后,假设您在该“类”目录中花费了很多时间,则可以通过键入以下内容直接跳到那里

j cl

您可以通过以下方式查看“关键权重”

jumpstat

我最近发现了一个更复杂但有趣且相关的工具,名为fgithub.com/clvv/f
tcdyl 2011年

14

正如saeedn所提到的,别名是一种很好的机制。bash shell还具有内置机制,可直接跳至某个位置:CDPATH。将其设置为PATH,但用于cd而不是搜索程序。

$ CDPATH=:~/repo/www/public/util
$ cd classes
/home/casebash/repo/www/public/util/classes

从联机帮助页:

   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.   A  sample  value  is
          ".:~:/usr".

我自己,已经将其与目录链接到了我想去的地方:

$ mkdir ~/cdshortcut
$ ln -s ~/repo/www/public/util/classes ~/cdshortcut/classes
$ CDPATH=:~/cdshortcut
/home/casebash/cdshortcut/classes

这样做的缺点是目录看起来不太正确,但是可以使用cd -P或设置纠正set -P


CDPATH很有趣,但是可能值得使用单独的go命令,以便始终可以预测其行为
Casebash 2011年

1
设置-P的+1。我的某些符号链接使我发疯,因为我不记得它们的真正去向,也忘记了显示该信息的命令。

@Joe,我要添加alias C='cd -P .'而不是set -P,因为对于系统符号链接,我不介意位于symlink目录中。
通配符

@Wildcard-有趣-您能举个例子对您有所作为吗?我只是跑了help cd,仍然不明白-P选项的作用。

@Joemkdir test; ln -s test linktotest; cd linktotest; pwd; cd -P .; pwd
通配符

9

您可以结合Bash的现有历史记录和历史记录搜索功能。按Ctrl-R开始渐进式反向搜索,然后开始输入路径中最有可能唯一的部分。

您可以继续输入字母,直到最后回到cd涉及该目录的最新命令为止,或者可以Ctrl-R再次按以跳回历史记录中,找到与您到目前为止输入的命令相匹配的下一个最新命令。

我一直都这样做。

实际上,我更进一步。一旦我发现了值得保留但不值得提交给shell脚本的命令序列,便开始使用&&;组合器将它们链接起来,这样我就可以反向搜索该长命令的子字符串,Enter并在以下位置运行整个序列一旦。

例如,这是在开发过程中如何构建和运行我的程序之一:

$ ( cd .. ; make install ) && ./start_my_program

我从顶级源目录下面的安装目录执行此操作。通过将cd,构建和安装部件包装在子外壳中,我可以确保无论在此过程中发生什么情况,我都能回到我的常规外壳中,而无需进行任何更改。只有成功(&&),我才启动内置和安装的程序。我可以在历史记录中找到Ctrl-Rthen sta,这就是我唯一需要唯一找到此命令序列所需的全部。

我如何使用它的另一个示例是为同一程序构建RPM的顺序。大部分繁琐的工作都在shell脚本中进行,但是我仍然通常需要键入一些命令来完成构建和部署已构建的RPM的所有工作,现在我几乎不需要重新键入了,因为Bash一直保持对我来说,这是历史。

将所有这些与export HISTSIZE=bignum和结合在一起,shopt histappend您就已经建立了一个大象命令存储器。

我曾经编写的另一个解决方案是在这里另一个问题的回答。它可能必须针对您的目的进行量身定制,并且仅处理cd命令,而历史记录搜索选项适用于所有位置和每个命令。


6

我本人alias用来缩短我经常去的长途旅行。您可以将aliases 集放入您的中bashrc,以便bash每次登录时都能记住它们。幸运的是,bash添加了别名以自动完成。

对于您的情况,我会这样写: alias go-classes="cd ~/repo/www/public/util/classes"



4

这绝不是完整的,也不是万无一失的,仅是起草之初。通过在其中添加以下内容,您~/.bashrc将具有三个命令来添加delete和list目录书签(它们基于shell别名,因此您也可以自动完成)。

BMFILE=~/.bash.bookmarks
[ -f "$BMFILE" ] && . "$BMFILE"

bmadd() {
    local abm
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    abm="alias $bm='cd \"$(pwd)\"'"

    if grep -q " $bm=" "$BMFILE"; then
        echo "Overwriting existing bookmark $bm"
        bmdel "$bm"
    fi
    echo "$abm" >> "$BMFILE"
    eval "$abm"
    #source "$BMFILE"
}

bmdel() {
    local bms
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    #sed -i.bak "/ $bm=/d" "$BMFILE"
    bms=$(grep -v " $bm=" "$BMFILE")
    echo "$bms" > "$BMFILE"
    unalias "$bm" 2> /dev/null
}

bmlist() {
    sed 's/alias \(.*\)=.cd "\(.*\)".$/\1\t\2/' "$BMFILE" | sort
}

用法很简单。bmadd与参数一起添加以参数命名的别名。此别名只是将光盘复制到设置该目录的目录。不带参数的情况下,它将使用当前目录名作为别名。以类似的方式,bmdel删除别名(如果存在)并bmlist列出当前书签。

例如

u@h:~ $ cd /usr/share/doc
u@h:/usr/share/doc $ bmadd
u@h:/usr/share/doc $ cd /usr/local/share/
u@h:/usr/local/share $ bmadd lshare
u@h:/usr/local/share $ cd
u@h:~ $ bmlist
doc     /usr/share/doc
lshare  /usr/local/share
u@h:~ $ doc
u@h:/usr/share/doc $ bmdel lshare
u@h:/usr/share/doc $ bmlist
doc     /usr/share/doc
u@h:/usr/share/doc $

4

不久前,我遇到了同样的需求,因此决定整理一些脚本,以帮助我为绝对/相对路径添加书签,并将它们映射为我容易记住的较短名称。

该脚本非常易于使用,它将简单地创建一个函数,该函数使用您提供的短名称作为要跳转到的目录的别名。您需要做的只是简单地输入该短名称,它将带您进入加书签的目录。

这是书签脚本的链接。顺便说一句,我将其命名为“书签”。

用法

安装后,使用起来非常简单。

标记目录:

$ mark /this/is/a/very/very/looooong/path mydir

导航到标记的目录:

$ mydir

要查看标记的内容:

$ marks
bin     -> /Users/khafaji/bin
eBooks  -> /Users/khafaji/eBooks

要删除标记的目录:

$ umark myDir

有关更多示例,安装说明等,请参阅非常详细的文档


3

cdargs 是用于目录书签的最佳工具。

有关使用示例,请参见YouTube上cd命令视频的书签

用法示例

cdargs是ncurses GUI,因此您可以在外壳中直观地导航。安装完成后,您可以通过采购shell脚本在给定的shell中进行设置:

$ source /etc/profile.d/cdargs.sh

这样可以启用几个函数,然后可以从外壳程序中调用它们。

调用GUI:

$ cv

导致这种类型的GUI:

   [.       ]  /home/saml/tst/88040
 0 [path0   ]  /home/saml/tst/88040/path0
 1 [path1   ]  /home/saml/tst/88040/path1
 2 [path2   ]  /home/saml/tst/88040/path2

您可以使用箭头键上下移动来浏览列表。左箭头()在目录树中上移一个级别,右箭头()将向下钻取到目录中。

标记目录:

您可以将其c用于导航的当前目录,也可以用于a添加当前用光标突出显示的目录。

操作方式:

cdargs在这方面有点类似于vi / vim,它具有模式的概念。其中有两个,浏览(B)和列表(L)。您可以通过外壳底部的显示屏查看所处的模式。

上市模式:

L: /home/saml/tst/88038

浏览模式:

B: /home/saml/tst/88038

您可以通过按Tab键(TAB)来更改模式。

这只是冰山一角,请查阅手册页(man cdargs)以及内置帮助以获取更多信息。


2

最好的工具是:wcd。我已经测试了许多其他工具,并且该工具完全按照您的要求使用,并且在许多方面都比以前的所有解决方案都要好。


1

其他答案是伟大而具体的。另一种看待它的方法是使用键盘宏处理器,它可以完成几乎所有您能想到的事情。

签出自动键。它可以替代文字处理器自动更正或bash历史记录之类的短语,还可以在您定义的热键上运行python脚本,该脚本几乎可以执行任何操作,还可以将击键发送到字符输入设备-就像您键入它们一样。

(与这个问题有关)它唯一的“缺点”是它需要一个GUI才能在-gnome或kde中运行。其他答案没有这个要求。

https://code.google.com/p/autokey/

1

还有另一个替代方案,称为z

它学习每个目录更改:

$ cd /tmp/
$ pwd
/tmp
$ cd
$ pwd
/home/user

然后,您可以稍后使用模糊匹配更改到该目录:

$ z mp
$ pwd
/tmp

1

Apparix是执行此操作的另一个工具。它的有用功能之一是,您可以直接跳到标记的子目录,并在这些子目录上使用Tab键完成。


0

我相信,另一个解决方案是to autojump并且zis fasd

它会跟踪您访问z dir-name的目录,并将更改为dir-name您最常使用的名称的目录。它还具有一些常用文件的功能。

您可以从以下网址克隆它:https : //github.com/clvv/fasd

安装简单明了,克隆,​​进行安装,然后修改您的.bashrc(或其他.zshrc)。


0

你需要一个别名添加到您.bashrc.bash_profile

## navigate to your home directory
$ cd ~
## list the contents of your home directory to see if you have `.bashrc` or `.bash_profile`
$ ls -a 
[`.bashrc` or `.bash_profile` should appear in the list]
## launch the text editor of your choice; I'll use vim here
## if no `~/.bashrc` or `~/.bash_profile`...
$ vim
## if, e.g., `~/.bash_profile` listed...
$ vim ~/.bash_profile

现在,假设您要使用的快捷方式~/Desktop/Coding/Projects来调用要键入的内容goto_Projs。您需要将以下行添加到在文本编辑器中打开的文件中:

alias goto_Projs='cd ~/Desktop/Coding/Projects'

现在,执行您的文本编辑器想要保存(/User/<yourusername>/或保存~/)并退出的所有操作,然后在返回shell提示时进行

source ~/.bash_profile

您的别名现在应该可以如上所述进行调用。


0

我使用在命令末尾添加注释,然后调用ctrl R反向搜索注释的方法。这具有以下优点:

  • 搜索自然语言的命令
  • 随时更改评论,并从中获取最新更新 ctrl R
  • 使用 ctrl Rtab即时对命令本身进行细微调整,从而使注释成为一系列类似命令的通用捷径
  • 无需设置,安装或簿记:-)
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.