目录书签为bash

是否有任何目录书签实用程序bash允许在命令行上移动更快?

UPDATE

感谢球员的反馈,但我创build了我自己的简单的shell脚本(随意修改/展开它)

function cdb() { USAGE="Usage: cdb [-c|-g|-d|-l] [bookmark]" ; if [ ! -e ~/.cd_bookmarks ] ; then mkdir ~/.cd_bookmarks fi case $1 in # create bookmark -c) shift if [ ! -f ~/.cd_bookmarks/$1 ] ; then echo "cd `pwd`" > ~/.cd_bookmarks/"$1" ; else echo "Try again! Looks like there is already a bookmark '$1'" fi ;; # goto bookmark -g) shift if [ -f ~/.cd_bookmarks/$1 ] ; then source ~/.cd_bookmarks/"$1" else echo "Mmm...looks like your bookmark has spontaneously combusted. What I mean to say is that your bookmark does not exist." ; fi ;; # delete bookmark -d) shift if [ -f ~/.cd_bookmarks/$1 ] ; then rm ~/.cd_bookmarks/"$1" ; else echo "Oops, forgot to specify the bookmark" ; fi ;; # list bookmarks -l) shift ls -l ~/.cd_bookmarks/ ; ;; *) echo "$USAGE" ; ;; esac } 

安装

1. /创build一个文件〜/ .cdb并将上面的脚本复制到它。

2.在你的〜/ .bashrc中添加以下内容

 if [ -f ~/.cdb ]; then source ~/.cdb fi 

3. /重新启动你的bash会话

用法

1. /创build一个书签

 $cd my_project $cdb -c project1 

2. /转到书签

 $cdb -g project1 

3. /列出书签

 $cdb -l 

4. /删除书签

 $cdb -d project1 

5. /我的书签在哪里存储?

 $cd ~/.cd_bookmarks 

另外,看看CDPATH

cd命令可用的以冒号分隔的搜索路径列表,功能类似于二进制文件的$ PATH变量。 $ CDPATH变量可以在本地的〜/ .bashrc文件中设置。

 ash$ cd bash-doc bash: cd: bash-doc: No such file or directory bash$ CDPATH=/usr/share/doc bash$ cd bash-doc /usr/share/doc/bash-doc bash$ echo $PWD /usr/share/doc/bash-doc 

 cd - 

这是相当于后退按钮的命令行(将您引导至上一个目录)。

在bash脚本/命令中,
你可以使用pushdpopd

PUSHD

保存并更改当前目录。 没有参数,pushd交换最上面的两个目录。

用法

 cd /abc pushd /xxx <-- save /abc to environment variables and cd to /xxx pushd /zzz pushd +1 <-- cd /xxx 

popd是删除变量(反向的方式)

感谢分享您的解决方案,我也想分享我的,我发现比以前遇到的任何其他更有用。

引擎是一个伟大的通用工具:Junegunn 命令行模糊查找器 。

它主要允许您以多种方式“模糊查找”文件,但也允许向其提供任意文本数据并过滤这些数据。 所以,快捷方式的想法很简单:我们需要的只是维护一个带有路径(这是快捷方式)的文件,并对该文件进行模糊过滤。 下面是它的外观:我们输入cdg命令(如果你喜欢,可以从“cd global”中获得),获取我们的书签列表,只需几个按键就可以选择需要的书签,然后按下Enter键。 工作目录更改为已选项目:

CDG

这是非常快速和方便的:通常我只需要输入所需项目的3-4个字母,其他所有项目都已经过滤了。 另外,当然我们可以通过箭头键或类似vim的按键组合来移动列表Ctrl+j / Ctrl+k

具有细节的文章: 你的shell的模糊快捷方式 。

也可以将其用于GUI应用程序(通过xterm):我将其用于我的GUI文件管理器Double Commander 。 我也计划写一篇关于这个用例的文章。

bookmarks.sh为Bash 4.0+版本提供书签管理系统。 它也可以使用午夜指挥官的热门名单。

受到这里的问题和答案的启发,我将下面的代码添加到我的~/.bashrc文件中。

有了这个你有一个favdir命令(功能)来管理您的收藏夹和自动完成功能,从这些收藏夹中选择一个项目。

 # --------- # Favorites # --------- __favdirs_storage=~/.favdirs __favdirs=( "$HOME" ) containsElement () { local e for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done return 1 } function favdirs() { local cur local IFS local GLOBIGNORE case $1 in list) echo "favorite folders ..." printf -- ' - %s\n' "${__favdirs[@]}" ;; load) if [[ ! -e $__favdirs_storage ]] ; then favdirs save fi # mapfile requires bash 4 / my OS-X bash vers. is 3.2.53 (from 2007 !!?!). # mapfile -t __favdirs < $__favdirs_storage IFS=$'\r\n' GLOBIGNORE='*' __favdirs=($(< $__favdirs_storage)) ;; save) printf -- '%s\n' "${__favdirs[@]}" > $__favdirs_storage ;; add) cur=${2-$(pwd)} favdirs load if containsElement "$cur" "${__favdirs[@]}" ; then echo "'$cur' allready exists in favorites" else __favdirs+=( "$cur" ) favdirs save echo "'$cur' added to favorites" fi ;; del) cur=${2-$(pwd)} favdirs load local i=0 for fav in ${__favdirs[@]}; do if [ "$fav" = "$cur" ]; then echo "delete '$cur' from favorites" unset __favdirs[$i] favdirs save break fi let i++ done ;; *) echo "Manage favorite folders." echo "" echo "usage: favdirs [ list | load | save | add | del ]" echo "" echo " list : list favorite folders" echo " load : load favorite folders from $__favdirs_storage" echo " save : save favorite directories to $__favdirs_storage" echo " add : add directory to favorites [default pwd $(pwd)]." echo " del : delete directory from favorites [default pwd $(pwd)]." esac } && favdirs load function __favdirs_compl_command() { COMPREPLY=( $( compgen -W "list load save add del" -- ${COMP_WORDS[COMP_CWORD]})) } && complete -o default -F __favdirs_compl_command favdirs function __favdirs_compl() { local IFS=$'\n' COMPREPLY=( $( compgen -W "${__favdirs[*]}" -- ${COMP_WORDS[COMP_CWORD]})) } alias _cd='cd' complete -F __favdirs_compl _cd 

在最后两行中,创建一个用于更改当前目录(具有自动完成)的别名。 有了这个别名( _cd ),你可以改变你最喜欢的目录之一。 可能你不想把这个别名改成适合你需要的东西

通过功能favdirs你可以管理你的收藏(见使用)。

 $ favdirs Manage favorite folders. usage: favdirs [ list | load | save | add | del ] list : list favorite folders load : load favorite folders from ~/.favdirs save : save favorite directories to ~/.favdirs add : add directory to favorites [default pwd /tmp ]. del : delete directory from favorites [default pwd /tmp ]. 

是的,在这篇Linux Journal文章中已经解释了Bash的DirB:目录书签

文章的一个例子是:

 % cd ~/Desktop % sd # save(bookmark) ~/Desktop as d % cd /tmp # go somewhere % pwd /tmp % gd # go to the desktop % pwd /home/Desktop 

@getmizanur我用你的cdb脚本。 我通过添加书签选项卡完成稍微增强了它。 这是我的cdb脚本版本。

 _cdb() { local _script_commands=$(ls -1 ~/.cd_bookmarks/) local cur=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W "${_script_commands}" -- $cur) ) } complete -F _cdb cdb function cdb() { local USAGE="Usage: cdb [-h|-c|-d|-g|-l|-s] [bookmark]\n \t[-h or no args] - prints usage help\n \t[-c bookmark] - create bookmark\n \t[-d bookmark] - delete bookmark\n \t[-g bookmark] - goto bookmark\n \t[-l] - list bookmarks\n \t[-s bookmark] - show bookmark location\n \t[bookmark] - same as [-g bookmark]\n Press tab for bookmark completion.\n" if [ ! -e ~/.cd_bookmarks ] ; then mkdir ~/.cd_bookmarks fi case $1 in # create bookmark -c) shift if [ ! -f ~/.cd_bookmarks/$1 ] ; then echo "cd `pwd`" > ~/.cd_bookmarks/"$1" complete -F _cdb cdb else echo "Try again! Looks like there is already a bookmark '$1'" fi ;; # goto bookmark -g) shift if [ -f ~/.cd_bookmarks/$1 ] ; then source ~/.cd_bookmarks/"$1" else echo "Mmm...looks like your bookmark has spontaneously combusted. What I mean to say is that your bookmark does not exist." ; fi ;; # show bookmark -s) shift if [ -f ~/.cd_bookmarks/$1 ] ; then cat ~/.cd_bookmarks/"$1" else echo "Mmm...looks like your bookmark has spontaneously combusted. What I mean to say is that your bookmark does not exist." ; fi ;; # delete bookmark -d) shift if [ -f ~/.cd_bookmarks/$1 ] ; then rm ~/.cd_bookmarks/"$1" ; else echo "Oops, forgot to specify the bookmark" ; fi ;; # list bookmarks -l) shift ls -1 ~/.cd_bookmarks/ ; ;; -h) echo -e $USAGE ; ;; # goto bookmark by default *) if [ -z "$1" ] ; then echo -e $USAGE elif [ -f ~/.cd_bookmarks/$1 ] ; then source ~/.cd_bookmarks/"$1" else echo "Mmm...looks like your bookmark has spontaneously combusted. What I mean to say is that your bookmark does not exist." ; fi ;; esac } 

是的,我写的那个叫做anc。

https://github.com/tobimensch/anc

Anc代表锚,但anc的锚只是书签。

它的设计易于使用,可以通过多种方式进行导航,可以通过给定文本模式,使用数字,交互式,返回或使用[TAB]完成。

我正在积极开展工作,并就如何使其做得更好提供意见。

请允许我从anc的github页面粘贴示例:

 # make the current directory the default anchor: $ anc s # go to /etc, then /, then /usr/local and then back to the default anchor: $ cd /etc; cd ..; cd usr/local; anc # go back to /usr/local : $ anc b # add another anchor: $ anc a $HOME/test # view the list of anchors (the default one has the asterisk): $ anc l (0) /path/to/first/anchor * (1) /home/usr/test # jump to the anchor we just added: # by using its anchor number $ anc 1 # or by jumping to the last anchor in the list $ anc -1 # add multiple anchors: $ anc a $HOME/projects/first $HOME/projects/second $HOME/documents/first # use text matching to jump to $HOME/projects/first $ anc pro fir # use text matching to jump to $HOME/documents/first $ anc doc fir # add anchor and jump to it using an absolute path $ anc /etc # is the same as $ anc a /etc; anc -1 # add anchor and jump to it using a relative path $ anc ./X11 #note that "./" is required for relative paths # is the same as $ anc a X11; anc -1 # using wildcards you can add many anchors at once $ anc a $HOME/projects/* # use shell completion to see a list of matching anchors # and select the one you want to jump to directly $ anc pro[TAB] 

Bashmarks是一个非常简单和直观的工具。 总之,安装后的用法是:

 s <bookmark_name> - Saves the current directory as "bookmark_name" g <bookmark_name> - Goes (cd) to the directory associated with "bookmark_name" p <bookmark_name> - Prints the directory associated with "bookmark_name" d <bookmark_name> - Deletes the bookmark l - Lists all available bookmarks 

除了@Dmitri Frank的回答 – 我通过简单的alias实现了cdb命令(又名cd书签 )(把这行加到你的~/.bash_profile ):

 alias b='cat ~/.cd-bookmarks | grep -v "^\s*#" | grep -v "^\s*$" | fzf' alias cdb='cd "$(b)"' 

创建文件~/.cd-bookmarks并输入你的路径,每行一个。 它支持空行和评论通过#

 $ cat ~/.cd-bookmarks ### Devel stuff ### /Users/pujezdsky/devel/projects/stackoverflow/ ### Photo stuff ### /Users/pujezdsky/Photos/ /Users/pujezdsky/Photos/last-import/ /Users/pujezdsky/Photos/dir with spaces/ 

不幸的是,它不支持~扩展,所以输入完整的路径。

那你就可以做了

 $ cdb 

而因为别名甚至更先进的东西

 $ mc `b` $ cp my-file.txt `b` $ touch `b`/test.sh 

不幸的是,如果书签路径中有空格,则必须引用`b`调用。 这使得它不那么英俊:

 $mc "`b`" 

注1:

在执行此操作之前, 请检查您是否已经有cdbb命令/别名以避免覆盖和故障。 最简单的方法是使用这些应该返回类似-bash: type: cdb: not found

 $ type cdb $ type b 

笔记2:

别名可以简化为

 alias b='egrep -v "(^\s*#|^\s*$)" ~/.cd-bookmarks | fzf' 

注3:

您也可以为您的书签添加当前文件夹的别名。 它和…一样简单

 alias ba='pwd >> ~/.cd-bookmarks' 

对于短期快捷方式,我在我各自的初始化脚本中有以下内容(对不起,我现在找不到源代码,并没有麻烦):

 function b() { alias $1="cd `pwd -P`" } 

用法:

在您想要书签的任何目录中

 b THEDIR # <THEDIR> being the name of your 'bookmark' 

它会创建一个别名cd(回)到这里。

要返回到“书签”的目录类型

 THEDIR 

它会运行存储的别名和CD在那里。

警告:只有在您明白这可能会覆盖现有shell别名以及意味着什么的情况下才使用。