Подтвердить что ты не робот

Закладка каталогов для bash

Есть ли какая-либо утилита закладок в каталоге для bash, чтобы позволить быстрее перемещаться в командной строке?

UPDATE

Спасибо, ребята за отзывы, однако я создал свою собственную простую оболочку script (не стесняйтесь ее изменять/расширять)

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 и скопируйте в него script.

2./в вашем ~/.bashrc добавьте следующие

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

3./перезапустите сеанс bash

ИСПОЛЬЗОВАНИЕ

1./для создания закладки

$cd my_project
$cdb -c project1

2./перейти к закладке

$cdb -g project1

3./для отображения закладок

$cdb -l 

4./удалить закладку

$cdb -d project1

5./где хранятся все мои закладки?

$cd ~/.cd_bookmarks
4b9b3361

Ответ 1

Кроме того, посмотрите 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 -

Это эквивалент командной строки кнопки "Назад" (переносит вас в предыдущий каталог, в котором вы были).

Ответ 2

Спасибо, что поделились вашим решением, и я тоже хотел бы поделиться своим делом, который я считаю более полезным, чем что-либо еще, с чем я сталкивался раньше.

Двигатель - отличный универсальный инструмент: нечеткий поисковик командной строки от Junegunn.

Он в первую очередь позволяет вам "нечетко находить" файлы несколькими способами, но также позволяет передавать на него произвольные текстовые данные и фильтровать эти данные. Итак, идея ярлыков проста: все, что нам нужно, это поддерживать файл с путями (которые являются ярлыками) и нечетко фильтровать этот файл. Вот как это выглядит: мы набираем команду cdg (из "cd global", если хотите), получите список наших закладок, выберите нужный файл всего за несколько нажатий клавиш и нажмите "Enter". Рабочий каталог изменяется на выбранный элемент:

cdg

Это очень быстро и удобно: обычно я просто набираю 3-4 буквы нужного элемента, а все остальные уже отфильтровываются. Кроме того, конечно, мы можем перемещаться по списку с помощью клавиш со стрелками или с помощью vim-подобных клавиш Ctrl+j/Ctrl+k.

Статья с подробностями: Нечеткие ярлыки для вашей оболочки.

Можно также использовать его для приложений GUI (через xterm): я использую это для своего диспетчера файлов GUI Double Commander. Я также планирую написать статью об этом случае использования.

Ответ 3

В bash script/command,
вы можете использовать pushd и popd

pushd

Сохранить, а затем изменить текущий каталог. Без аргументов pushd обменивается двумя верхними каталогами.

Использование

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

popd - удалить переменную (обратную сторону)

Ответ 4

bookmarks.sh предоставляет систему управления закладок для Bash версии 4.0+. Он также может использовать горячий список Midnight Commander.

Ответ 5

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

Ответ 6

Вдохновленный вопросом и ответами здесь, я добавил строки ниже в мой ~/.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 ].

Ответ 7

Да, есть DirB: Закладки каталога для Bash, хорошо объясненные в этой статье в Linux Journal

Пример из статьи:

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

Ответ 8

@getmizanur Я использовал ваш cdb script. Я немного улучшил его, добавив вкладку закладка. Здесь моя версия вашего cdb script.

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

Ответ 9

Да, тот, который я написал, который называется anc.

https://github.com/tobimensch/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]

Ответ 10

В дополнение к @Dmitri Frank answer - я выполнил команду cdb (aka cd bookmark) с помощью простого alias (добавьте эту строку в свой ~/.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:

Прежде чем вы это сделаете, проверьте, есть ли у вас cdb, b команды/псевдонимы, чтобы избежать их перезаписывания и сбоя. Самый простой способ - использовать эти команды, которые должны возвращать что-то вроде -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'

Ответ 11

Для краткосрочных ярлыков у меня есть следующее в моем соответствующем init script (Извините, я не могу найти источник прямо сейчас и не беспокоился тогда):

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

Применение:

В любом каталоге, который вы хотите создать тип закладки

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

Здесь будет создан псевдоним cd (назад).

Чтобы вернуться к типу с именем "bookmarked"

THEDIR

Он запустит сохраненный псевдоним и cd.

Предостережение: Используйте только в том случае, если вы понимаете, что это может переопределить существующие псевдонимы оболочки и что это значит.

Ответ 12

Я ежедневно использую to.sh для создания и навигации по закладкам в bash. Он поддерживает автозаполнение тегов и возможность легко добавлять/удалять закладки.

https://github.com/Grafluxe/to.sh


Полное раскрытие, я написал этот инструмент :)