bash的目录书签

时间:2011-09-10 20:35:13

标签: linux bash ubuntu

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

更新

感谢大家的反馈,但是我创建了自己的简单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. /创建一个文件〜/ .cdb并将上面的脚本复制到其中。

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

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

3. /重启你的bash会话

USAGE

1. /创建书签

$cd my_project
$cdb -c project1

2. /转到书签

$cdb -g project1

3. /列出书签

$cdb -l 

4. /删除书签

$cdb -d project1

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

$cd ~/.cd_bookmarks

12 个答案:

答案 0 :(得分:24)

另外,请查看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 -

这是后退按钮的命令行等效项(将您带到您以前的目录中)。

答案 1 :(得分:9)

感谢您分享您的解决方案,我也愿意与我分享,我觉得这比我以前遇到的任何其他内容都更有用。

引擎是一个伟大的,通用的工具:Junegunn的command-line fuzzy finder

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

cdg

它非常快速和方便:通常我只需要输入所需项目的3-4个字母,其他所有项目都已被过滤掉。此外,我们当然可以使用箭头键或类似vim的键绑定Ctrl+j / Ctrl+k来浏览列表。

文章详情:Fuzzy shortcuts for your shell

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

答案 2 :(得分:7)

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

pushd

  

保存然后更改当前目录。没有参数,pushd交换前两个目录。

用法

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

popd是删除变量(反向)

答案 3 :(得分:6)

bookmarks.sh为Bash 4.0+提供书签管理系统。它也可以使用Midnight Commander热门列表。

答案 4 :(得分:3)

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

答案 5 :(得分:2)

受到这里的问题和答案的启发,我将下面的行添加到我的~/.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 ].

答案 6 :(得分:1)

是的,DirB:Bash的目录书签在this Linux Journal article

中得到了很好的解释

文章的一个例子:

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

答案 7 :(得分:1)

@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
}

答案 8 :(得分:1)

是的,我写过的,叫做anc。

https://github.com/tobimensch/anc

Anc代表主播,但是anc的主播实际上只是书签。

它的设计易于使用,并且有多种导航方式,可以通过提供文本模式,使用数字,交互式,返回或使用[TAB]完成。

我积极致力于此,并开始就如何做得更好提出意见。

请允许我在此处粘贴来自anc&#39的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]

答案 9 :(得分:1)

除了@Dmitri Frank的answer之外 - 我已经通过简单的cdb实现了alias命令(又名 cd bookmark )(添加这一行到你的~/.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

因为b别名甚至更高级的东西

$ 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:

     

b别名可以简化为

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

注3:

     

您还可以为将当前文件夹添加到书签中设置别名。它就像

一样简单
alias ba='pwd >> ~/.cd-bookmarks'

答案 10 :(得分:0)

对于短期快捷方式,我在各自的初始化脚本中都有以下内容(抱歉。我现在无法找到源代码,并且没有烦恼):

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

<强>用法:

在任何要添加书签的目录中

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

它将创建cd(返回)到此处的别名。

要返回标记为&#39;目录类型

THEDIR

它将运行存储的别名并回到那里。

警告:只有在您了解 这可能会覆盖现有的shell别名和 意味着什么时才使用。

答案 11 :(得分:0)

如实践所示,每天不需要那么多书签。

因此我们可以将它们存储在脚本中:

function go {
    # go home dir if no params
    if [ $# -eq 0 ]; then cd ~; return; fi;

    # declare an assoc array with CAPITAL -A switch
    declare -A o
    # declare aliases and targets
    o[apd]=$APPDATA
    o[cli]='/mnt/c/CLI/'
    o[closk]='/mnt/d/JOB/CLosk.Work/Dev._default/'
    o[ds]='/mnt/d/JOB/DS/'
    o[gh]='/mnt/d/Alpha/GitHub/'
    o[pf]='/mnt/c/Program Files/'
    o[wsa]='/mnt/d/JOB/WSA/Dev/'

    # here we go
    if [ ${o[$1]+_} ]; then cd "${o[$1]}"; fi
}

使用关联数组可以轻松校正链接列表。

您可以看到该脚本也已在Windows下成功使用。 我也在CentOS和Ubuntu下使用此脚本。当然还有其他链接。

我也在用这个:

alias ~='go'

所以:

~ # go to home dir
~ apd # go to system Application Data folder

以此类推。